2013-03-23 96 views
0

我試圖更新tkinter for循環中的文本並顯示標籤。根據.after方法,這應該在一秒之後發生。Tkinter for循環中未使用'after'方法更新標籤小部件

def rightString(self, gro, string): 
    for z in string: 
     self.message2.configure(text="Good job, %s is a member of %s!" % (z, gro.getName())) 

     root.after(1000) 
     self.message2.grid() 
     print(z, " should be displayed!") 

我希望這是足夠的信息;我覺得我缺少一些非常基本的東西。打印函數在IDLE中調用並顯示'string'的每個成員。我不明白爲什麼self.message2不顯示。它顯示在腳本的其他部分,不包括'after'方法。

如果有必要,我會發布更多的代碼。

謝謝。

+1

'self.message2.configure()'就足夠了 - 你不必再次調用'self.message2.grid()'。 – 2013-03-23 20:06:47

+0

@ A.Rodas我認爲這不會影響結果。我剛剛嘗試過,但沒有再次調用網格,沒有工作。 – 2013-03-23 20:21:21

回答

1

如果要更改標籤的文本每一秒,那麼你必須與after重新安排這些功能:

def rightString(self, gro, string): 
    if string: 
     z = string[0] 
     self.message2.configure(text="Good job, %s is a member of %s!" % (z, gro.getName())) 
     root.after(1000, lambda: self.rightString(gro, string[1:]) 
     print(z, " should be displayed!") 

正如我在我的評論已經說過了,打電話grid()每次換時間該文本是沒有必要的。


編輯:要執行不同的功能時,所有字符串的處理完成後,您可以在else塊添加調用它:

def rightString(self, gro, string): 
    if string: 
     # ... 
    else: 
     doSomethingElse() 
+0

感謝您的幫助! – 2013-04-05 13:45:44

+0

我正在使用此方法作爲類的一部分,並且在方法調用之後有幾個命令。出於某種原因,這個方法被調用一次,字符串[0]被顯示,然後它跳轉到類中的以下命令。它只在之後通過「字符串」列表繼續。你知道我怎麼可以修改這個,以便它不會繼續執行def rightString,直到它完成爲止?謝謝。 – 2013-04-12 17:26:36

+0

@DavidJ。我已經爲我的答案添加了一個可能的解決方案。 – 2013-04-12 20:39:44

0

它不顯示,因爲您正在阻止事件循環處理事件,特別是導致其重新繪製屏幕上的窗口的事件。您需要重構代碼,以避免僅使用一個參數調用after