我在after
中使用Tkinter
方法时遇到问题。
计划是以1秒的间隔打印i
。我检查了after
方法是否合适,但我不确切知道。
这是代码。
# -*- coding: utf-8 -*-
from Tkinter import *
import time
root = Tk()
root.title("Program")
root['background'] ='gray'
def command_Print():
for i in range(0, 10, 1):
time.sleep(1)
Label0.after(1)
Labelvar.set(i)
Labelvar = StringVar()
Labelvar.set(u'original value')
Frame0 = Frame(root)
Frame0.place(x=0, y=0, width=100, height=50)
Label0 = Label(Frame0, textvariable=Labelvar, anchor='w')
Label0.pack(side=LEFT)
Frame_I = Frame(root)
Frame_I.place(x = 100, y = 0, width=100, height=70)
Button_I = Button(Frame_I, text = "Button" , width = 100, height=70, command = command_Print)
Button_I.place(x=0, y=0)
Button_I.grid(row=0, column=0, sticky=W, pady=4)
Button_I.pack()
root.mainloop()
答案 0 :(得分:4)
after
(例如:after(10)
)与调用time.sleep
相同,通常应该避免。由于它使您的GUI处于休眠状态,因此您的GUI将无法响应任何事件(包括用户或操作系统刷新或调整窗口大小的请求)
当您使用两个或多个参数调用after
时,第二个参数是对将来要调用的函数的引用。所有剩余的参数都将传递给该函数。
Tkinter维护一个事件队列。 mainloop
是监视该队列并在事件进入时运行事件的函数。当您调用after
时,您请求的函数只是添加到带有时间戳的队列中。当它准备好被处理时,tkinter将调用该函数并传入参数。就这么简单。
答案 1 :(得分:2)
在Tkinter应用程序中根本不使用time.sleep()
。让回调计划使用after()
调用自身。
def command_Print(counter=0):
Labelvar.set(counter)
if counter < 10:
root.after(1000, lambda: command_Print(counter+1))
此外,range(0, 10, 1)
只是range(10)
。没有必要重复默认值。