你好,我只是想在循環過程中,該標籤改變/刷新,但它不工作Python的Tkinter的:迴路標籤
這是我的代碼
fen1 = Tk()
v = StringVar()
Label(fen1,textvariable=v).pack()
i=0
while(1):
i=i+1
v.set(i)
fen1.mainloop()
感謝
你好,我只是想在循環過程中,該標籤改變/刷新,但它不工作Python的Tkinter的:迴路標籤
這是我的代碼
fen1 = Tk()
v = StringVar()
Label(fen1,textvariable=v).pack()
i=0
while(1):
i=i+1
v.set(i)
fen1.mainloop()
感謝
這裏,試試這個:
from Tkinter import *
import time
root=Tk()
variable=StringVar()
def update_label():
i=0
while 1:
i=i+1
variable.set(str(i))
root.update()
your_label=Label(root,textvariable=variable)
your_label.pack()
start_button=Button(root,text="start",command=update_label)
start_button.pack()
root.mainloop()
這應該給你一個很好的例子。然而,值得注意的是,while循環過程中,必須調用root.update()
否則你的圖形用戶界面將凍結,直到循環結束(在這種情況下,從未那樣),從不顯示你的數字是很重要的。
另外請注意,您可以從可以從您的程序中的任何地方撥打電話update_label()
。出於示例目的,我只是將它添加到開始按鈕。
你的代碼出了什麼問題,你已經設置了while循環自由浮動,最重要的是之前您的GUI的主循環。當你這樣做,因爲這個循環是infinate,它永遠不會讓Tkinter
啓動其mainloop()
。但是,如果你把while循環後的主循環,那麼這將永遠不會被執行,直到後退出GUI,這是因爲,直到它停止(關閉GUI)的主循環是infinate。
因此,要解決這個問題,你只需把它放在一個函數和Tkinter
的主循環中以後調用它。你可以這樣做多種方式爲好,例如,你可以使用.after()
一定的時間後執行特定的任務,或使它成爲一個按鈕的命令被按下時運行,等。,等。 。
但是,你應該使用的正確代碼就是下面,因爲你真的不希望在你的代碼infinate循環(其他則主循環):
class App (object):
def __init__(self):
self.root=Tk()
self.variable=StringVar()
self.i=0
self.your_label=Label(self.root,textvariable=self.variable)
def grid(self):
self.your_label.pack()
def update_label(self):
self.i=self.i+1
self.variable.set(str(self.i))
self.root.after(20,self.update_label)
def run(self):
self.grid()
self.root.after(20,self.update_label)
self.root.mainloop()
if __name__=='__main__':
App().run()
您的代碼永遠不會去mainloop
。爲了看到這樣的事情,你需要綁定一個回調函數中的更新,這個回調函數會在mainloop中被調用(間接地通過事件)。
-1:你永遠不應該調用睡在GUI的主線程中。在答案中這樣做是一個不好的例子。當你說通過調用'update'這個永遠不會凍結你是錯誤的。雖然睡眠是活躍的,但UI _將被凍結,即使只有半秒鐘。 –
@BryanOakley好吧,我改變了這一點。 –
它仍然不是正確的解決方案。作爲一個經驗法則,除了不調用'sleep'外,你也不應該有無限循環。爲了每半秒更新一次標籤,你應該利用事件循環並在' –