我尝试使用两种不同类型的解决方案来解决同样的问题。在我的第一个解决方案中,我能够在完成while
循环执行后看到窗口,即在count
值变为5之后,在我的第二个解决方案中,我首先创建窗口,然后创建值{ {1}}正在递增。
我的第一个解决方案:
count
我的第二个解决方案:
from Tkinter import *
import time
root = Tk()
count =0
def counter():
global count
while(count<5):
Label(root, text=count).pack()
time.sleep(2)
count += 1
count = counter()
root.mainloop()
在from Tkinter import *
count = 0
def counter_label(label):
def counter():
global count
count += 1
label.config(text=str(count))
label.after(2000, counter)
counter()
root = Tk()
label = Label(root, fg="red")
label.pack()
counter_label(label)
root.mainloop()
中是否存在循环的标准方法,即使在创建窗口之后也会发生循环?我的第二个解决方案似乎不是标准的,只是在一段固定的时间后调用一个函数。
答案 0 :(得分:2)
区别在于第一个示例,time.sleep(2)不会控制事件循环,因此所有pack()命令都排队等待事件循环。 在每次可见的Tk更改后,您可以调用 root.update(),让事件循环赶上队列:
from Tkinter import *
import time
root = Tk()
count =0
def counter():
global count
while(count<5):
Label(root, text=count).pack()
root.update() # allow window to catch up
time.sleep(2)
count += 1
count = counter()
root.mainloop()
答案 1 :(得分:0)
我认为这可能是你想要的东西:
import Tkinter as tk
class UpdateLabel(tk.Label):
def __init__(self, *args, **kwargs):
tk.Label.__init__(self, *args, **kwargs)
self._count = 0
def update_text(self):
self.config(text=str(self._count))
self._count += 1
self.after(2000, self.update_text)
root = tk.Tk()
label = UpdateLabel(root)
label.pack()
label.update_text()
root.mainloop()
这将使标签从0增加到无穷大 - 每2秒递增一次。当然,你总是可以在update
中设置一个条件,以便在某一点或其他任何地方停止计数......
这与你的第二个例子没什么不同......我只是将数据封装在一个类中以使事情变得更好一点,但这个想法几乎是一样的(递归地有一个函数调用本身) “ 1 通过after
。)
一般来说,如果您希望以特定间隔触发事件,Widget.after
是您正在寻找的“标准”方法。
1 注意,它并不是真正地递归调用(这很好)。它正在注册自己,以便在Tkinter事件循环的某个后期再次调用。