2013-08-30 177 views
1

目前的狀態,我有以下代碼:蟒蛇顯示的代碼

from Tkinter import * 

root = Tk() 

def count(): 
    for i in range(300): 
     Display.configure(text = 'The current number is: '+str(i)) 

Button = Button(root, text = 'Start', command = count) 
Button.pack() 

Display = Label(root) 
Display.pack() 

root.mainloop() 

我希望它是點擊「開始」按鈕計數期間顯示當前數字,但它不會工作後。 它只顯示計數完成後的數字,因此計數後只顯示:「當前編號爲:299」。 (這點是我想知道如何顯示代碼的當前狀態。 (我需要做的是收集特定文件比它複製到特定地點的應用程序,我希望它顯示是哪個文件目前複製,應用與作品的作品顯示當前文件的例外。我試圖測試的代碼顯示上面。)

回答

1

在您的示例代碼,問題在於,首先,顯示在你的循環內更新沒有任何變化,第二,如果它更新,它將快速查看除最後一個以外的任何其他數字。

一個簡單的解決辦法是調用root.update_idletasks()來給顯示更改更新。

from Tkinter import * 
import time 

root = Tk() 

def count(): 
    for i in range(300): 
     Display.configure(text = 'The current number is: '+str(i)) 
     root.update_idletasks() 
     time.sleep(0.01) # just to see something 

Button = Button(root, text = 'Start', command = count) 
Button.pack() 

Display = Label(root) 
Display.pack() 

root.mainloop() 

一個可能是更好的方法是使用一個協程(我裹成裝飾在這裏)和after_idle

import time 
from Tkinter import * 

root = Tk() 

def updatesdisplay(func): 
    def driver(iterator): 
     try: next(iterator) 
     except StopIteration: pass 
     else: root.after_idle(driver, iterator) 
    def wrapped(): 
     driver(func()) 
    return wrapped 

@updatesdisplay 
def count(): 
    for i in range(300): 
     time.sleep(0.005) # just to see something 
     Display.configure(text = 'The current number is: '+str(i)) 
     yield # chance to update display here 

Button = Button(root, text = 'Start', command = count) 
Button.pack() 

Display = Label(root) 
Display.pack() 

root.mainloop() 
+0

感謝,這正是我一直在尋找! 一個次要的事情:如果我使用Display.place()方法,和迭代thorugh包含字符串(字符串的長度可以在24的範圍內和65之間變化)的列表,顯示它從左跳文本時對。 如果我修改代碼的方式,即用戶必須點擊該按鈕,然後它會顯示在列表中的下一個項目,該文本是靜態的(所以它的工作原理就是我想要的)。 有沒有解決方案? – user2665140

+0

@ user2665140可能很難說,沒有看到一個例子。也許只需用代碼重新發布問題發佈一個新問題。 – sloth