基于Tkinter事件的背景标签更新

时间:2015-08-18 01:49:37

标签: python tkinter label updating

我的程序进行复杂的计算,持续约30分钟。我想更新Tkinter GUI中某些变量的值,理想情况下某些变量链接到某些标签,以便在更改其值时自动更新。虽然我明白我可以创建2个线程(一个用于主程序,一个用于TKinter,每隔一秒左右调用一次),我想知道是否有更优雅的方法来处理这个问题。任何建议都表示赞赏。

以下示例显示了它的外观,但示例并不起作用。

import Tkinter as tk
import time

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.counter = tk.Label(self, text="")
        self.counter.pack()

        # start the clock "ticking"
        self.mainLoop()

    def mainLoop(self):
        for i in range (10000):
            j=i^2
            self.counter.configure(text=str(j))
            time.sleep(0.1)

if __name__== "__main__":
    app = SampleApp()
    app.mainloop()

但是,当mainLoop替换为:

时,它确实有效
def mainLoop(self):
    now = time.strftime("%H:%M:%S" , time.gmtime())
    self.counter.configure(text=now)
    # call this function again in one second
    self.after(1000, self.mainLoop)

我的问题:

  1. 为什么它适用于" self.after"但不是for for循环
  2. 是否有更优雅的方式更新标签事件驱动(不是基于按钮,而是基于更改某些变量的计算)

1 个答案:

答案 0 :(得分:0)

回答第一个问题 -

  

为什么它适用于" self.after"但没有for循环

当创建该类的对象时,将调用类的__init__()方法。现在,在您的情况下,该类将在行中创建 -

app = SampleApp()

在您的__init__()中,您可以致电 - self.mainLoop()

for循环的情况下,所有这些都在主线程中运行。所以它不会从它已经完成的self.mainLoop()返回,因为你没有作为一个单独的线程启动self.mainLoop(),你在同一个线程中这样做。因此,只有在self.mainLoop()`完成并返回控件后,控件才会到达root.mainloop()行。

如果使用after()方法,它的行为类似于在一段时间后注册要触发的事件,并立即返回,它不会等待那么多时间,也不会等待函数回来。因此,控件立即返回,并调用root.mainloop()来显示GUI。