2012-07-03 26 views
2

你好,我只是想在循環過程中,該標籤改變/刷新,但它不工作Python的Tkinter的:迴路標籤

這是我的代碼

fen1 = Tk() 

v = StringVar() 
Label(fen1,textvariable=v).pack() 

i=0 

while(1): 
    i=i+1 
    v.set(i) 
fen1.mainloop() 

感謝

回答

5

這裏,試試這個:

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() 
+0

-1:你永遠不應該調用睡在GUI的主線程中。在答案中這樣做是一個不好的例子。當你說通過調用'update'這個永遠不會凍結你是錯誤的。雖然睡眠是活躍的,但UI _將被凍結,即使只有半秒鐘。 –

+0

@BryanOakley好吧,我改變了這一點。 –

+0

它仍然不是正確的解決方案。作爲一個經驗法則,除了不調用'sleep'外,你也不應該有無限循環。爲了每半秒更新一次標籤,你應該利用事件循環並在' –

0

您的代碼永遠不會去mainloop。爲了看到這樣的事情,你需要綁定一個回調函數中的更新,這個回調函數會在mainloop中被調用(間接地通過事件)。