我閱讀了一些關於tkinter的教程(基本),並學習瞭如何創建一個主循環併爲其添加gui元素。還學會了如何將操作綁定到按鈕小部件。現在在命令行上繪製tkinter畫布
我想做到這一點:
- 推出Tkinter的帆布
- 能夠將這些命令後,從控制檯讀取命令和更新畫布。
例如: 謹在控制檯上的參數和某些圖形元素命令被添加到畫布(和畫布後更新)。
是可能的事情,也許threading有關? 你能否指出我認爲最合理的一個方向?
我閱讀了一些關於tkinter的教程(基本),並學習瞭如何創建一個主循環併爲其添加gui元素。還學會了如何將操作綁定到按鈕小部件。現在在命令行上繪製tkinter畫布
我想做到這一點:
例如: 謹在控制檯上的參數和某些圖形元素命令被添加到畫布(和畫布後更新)。
是可能的事情,也許threading有關? 你能否指出我認爲最合理的一個方向?
下面是通過標準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™將會發生。 :)
想出了這個:
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直接讀取命令然後打開設置命令參數的對話框會更好。
是的,從一個Entry小部件獲取命令對於用戶和程序員來說都更簡單。OTOH,控制檯窗口有一些很好的功能:如果你導入readline,你可以得到命令行編輯和歷史記錄(如果你的平臺支持readline的話)。 –
在閱讀關鍵事件後,是否有任何一種將焦點放回控制檯窗口的命令? – Marco
SO不是免費的代碼服務。請向我們展示您迄今爲止自己解決問題所做的工作,並向我們提供[MCVE](http://stackoverflow.com/help/mcve)。 –
是的,我知道。事實上,我不想讓代碼回來。我只想知道是否可以接受來自控制檯的輸入(而不是閱讀事件),並在之後更新tkinter窗口。問題是我看到很多tkinter用作輸入接口的例子,而我想讓控制檯作爲接口運行,而tkinter窗口只顯示沒有交互的結果。如果它是與線程有關的東西,我會更加註意這一點,但我需要一個地方開始。 – Marco
你可以做到這一點,它甚至不需要線程,但我想這沒有線程有點笨重。我會很快發佈一個簡短的演示。 OTOH,對用戶來說不是一個很好的體驗,不得不在Tkinter GUI和控制檯窗口之間進行切換。我想如果你強迫GUI總是在控制檯窗口之上,這並不算太壞。 –