python显示代码的当前状态

时间:2013-08-30 08:01:09

标签: python tkinter progress

我有以下代码:

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 个答案:

答案 0 :(得分: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()