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”。(这样做的目的是我想知道如何显示代码的当前状态。(我需要制作一个收集特定文件而不是将其复制到特定位置的应用程序,并且我希望它显示它当前是什么文件复制。该应用程序与显示当前文件的工作除外。我尝试使用上面的代码测试显示。)

4

1 回答 1

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()
于 2013-08-30T08:41:40.113 回答