如何在Tkinter中使用循环

时间:2014-06-16 02:50:29

标签: python user-interface tkinter

我尝试使用两种不同类型的解决方案来解决同样的问题。在我的第一个解决方案中,我能够在完成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() 中是否存在循环的标准方法,即使在创建窗口之后也会发生循环?我的第二个解决方案似乎不是标准的,只是在一段固定的时间后调用一个函数。

2 个答案:

答案 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事件循环的某个后期再次调用。