我有以下代码:
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”。 (关键在于我想知道如何显示代码的当前状态。 (我需要创建一个收集特定文件的应用程序,而不是将其复制到特定的位置,我希望它显示当前正在复制的文件。应用程序使用的工作除了显示当前文件。我试图测试显示使用上面的代码。)
答案 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()