2016-09-25 121 views
-1

我閱讀了一些關於tkinter的教程(基本),並學習瞭如何創建一個主循環併爲其添加gui元素。還學會了如何將操作綁定到按鈕小部件。現在在命令行上繪製tkinter畫布

我想做到這一點:

  1. 推出Tkinter的帆布
  2. 能夠將這些命令後,從控制檯讀取命令和更新畫布。

例如: 謹在控制檯上的參數和某些圖形元素命令被添加到畫布(和畫布後更新)。

是可能的事情,也許threading有關? 你能否指出我認爲最合理的一個方向?

+0

SO不是免費的代碼服務。請向我們展示您迄今爲止自己解決問題所做的工作,並向我們提供[MCVE](http://stackoverflow.com/help/mcve)。 –

+0

是的,我知道。事實上,我不想讓代碼回來。我只想知道是否可以接受來自控制檯的輸入(而不是閱讀事件),並在之後更新tkinter窗口。問題是我看到很多tkinter用作輸入接口的例子,而我想讓控制檯作爲接口運行,而tkinter窗口只顯示沒有交互的結果。如果它是與線程有關的東西,我會更加註意這一點,但我需要一個地方開始。 – Marco

+0

你可以做到這一點,它甚至不需要線程,但我想這沒有線程有點笨重。我會很快發佈一個簡短的演示。 OTOH,對用戶來說不是一個很好的體驗,不得不在Tkinter GUI和控制檯窗口之間進行切換。我想如果你強迫GUI總是在控制檯窗口之上,這並不算太壞。 –

回答

0

下面是通過標準input函數從控制檯抓取用戶輸入的簡單演示。這種技術有點笨重,因爲我們必須明確告訴Tkinter通過單擊Button(或其他GUI事件)來獲取輸入字符串,但這對您的應用程序可能不是什麼大問題。

import tkinter as tk 

root = tk.Tk() 
stuff = tk.StringVar() 
display = tk.Label(root, textvariable=stuff) 
display.pack() 

def get_input(): 
    s = input("CMD: ") 
    stuff.set(s) 

tk.Button(root, text="Get input", command=get_input).pack() 
root.mainloop() 

當您單擊"Get input"按鈕時,將在控制檯窗口中打印「CMD:」提示。輸入輸入後,字符串將被複制到標籤。如果您在輸入輸入行之前再次點擊按鈕,Bad Things™將會發生。 :)

0

想出了這個:

from Tkinter import * 
import random 

root = Tk() 
width = 800 
height = 600 

def key(event): 
    s = raw_input("CMD: ") 

    if s == 'quit': 
     root.destroy() 

    if s == 'l': 
     x1 = random.randint(0,width) 
     x2 = random.randint(0,width) 
     y1 = random.randint(0,height) 
     y2 = random.randint(0,height) 
     frame.create_line(x1,y1,x2,y2) 
     frame.focus_force() 



frame = Canvas(root, width=width, height=height) 
frame.bind("<Key>", key) 
frame.pack() 
frame.focus_set() 

root.mainloop() 

通過這種方式實在是有點,因爲我必須找回焦點單擊其窗口上的控制檯上進入前的東西複雜化。也許從Tkinter直接讀取命令然後打開設置命令參數的對話框會更好。

+0

是的,從一個Entry小部件獲取命令對於用戶和程序員來說都更簡單。OTOH,控制檯窗口有一些很好的功能:如果你導入readline,你可以得到命令行編輯和歷史記錄(如果你的平臺支持readline的話)。 –

+0

在閱讀關鍵事件後,是否有任何一種將焦點放回控制檯窗口的命令? – Marco