因此,在 tkinter 中不断更新某些内容的主要问题是,至少对于您的大部分程序,您都被锁定在主循环中。
出于所有意图和目的,这基本上意味着在您的程序中,您永远不会真正调用最后一行,因为 Python 正在等待主循环结束。
正如您正确推测的那样,我们解决此问题的方法是使用after() 函数。如果您还不知道如何使用它(并计划继续使用 tkinter),您绝对应该将它添加到您的工具包中。
首先,我对您的程序进行了快速更改,以便获得作为温度返回的值。我这样做是为了演示如何更新文本小部件,它涉及添加一个仅返回随机值的新函数。
import tkinter as tk
import random
def read_current_Temperature():
return random.randint(1, 100)
HEIGHT = 300
WIDTH = 500
root = tk.Tk()
canvas = tk.Canvas(root, height = HEIGHT, width = WIDTH)
canvas.pack()
aktTemp = tk.Label(root, text=str(read_current_Temperature())+"°C", fg="red")
aktTemp.pack()
root.mainloop()
read_current_Temperature()
现在,正如您在运行上述程序时看到的那样,我们基本上得到了与您的原始程序相同的结果。 读取温度(读取:随机生成),然后更新小部件,然后 . . .其他不多。
所以,首先我们需要找到在哪里使用after()。有很多方法可以做到这一点,但最简单的方法(主观地,在这种情况下。我建议尽可能使用class,但这需要更多实质性的重写)是添加一个新函数,像下面这样:
import tkinter as tk
import random
def read_current_Temperature():
return random.randint(1, 100)
def update():
aktTemp.config(text=str(read_current_Temperature())+"°C")
aktTemp.after(1000, update)
HEIGHT = 300
WIDTH = 500
root = tk.Tk()
canvas = tk.Canvas(root, height = HEIGHT, width = WIDTH)
canvas.pack()
aktTemp = tk.Label(root, text=str(read_current_Temperature())+"°C", fg="red")
aktTemp.pack()
update()
root.mainloop()
让我们逐行看一下。
update()
我们点击的第一个新行(运行时,而不是读取时)是对我定义的新函数的调用,说到 . . .
def update():
aktTemp.config(text=str(read_current_Temperature())+"°C")
aktTemp.after(1000, update)
这个函数的第一行。 . .
aktTemp.config(text=str(read_current_Temperature())+"°C")
。 . .只是告诉程序去获取新温度并将其分配为标签小部件aktTemp 的text 属性。这是实际上在 GUI 中进行更改的行。
另一方面,这条线。 . .
aktTemp.after(1000, update)
。 . .是我上面提到的after的使用。所有这一切都在说“每 1000 毫秒,调用函数 update()”,正如我们从上面所知道的,然后将标签更新为新的温度并开始另一个 1000 毫秒的延迟,然后再次调用自身。
You can read more about after() here.