我想在我的gui上显示一个永久改变(温度)的动态数字。如何使我的标签动态?你知道吗
我试图设置其他值,但知道调用mainLoop后,程序处于无限状态。我读过函数.after(),但我不知道如何准确地使用它,因为我不想定义新函数。我得到一个返回值,只想更新它。你知道吗
import tkinter as tk
from src import SerialPort as sp
HEIGHT = 300
WIDTH = 500
root = tk.Tk()
canvas = tk.Canvas(root, height = HEIGHT, width = WIDTH)
canvas.pack()
aktTemp = tk.Label(root, text=str(sp.read_current_Temperature())+"°C", fg="red")
aktTemp.pack()
root.mainloop()
你知道吗sp.读取当前温度()-它将返回当前温度,因此我希望标签根据此函数调用每秒刷新一次。你知道吗
因此,tkinter中不断更新某些内容的主要问题是,至少对于大多数程序来说,您被锁定在主循环中。你知道吗
出于所有目的,这基本上意味着在程序中,您永远不会真正调用最后一行,因为Python正在等待主循环结束。你知道吗
我们解决这个问题的方法是,正如您正确推测的那样,使用
after()
函数。如果您还不知道如何使用它(并计划继续使用tkinter),那么您一定要将它添加到您的工具箱中。你知道吗首先,我对你的程序做了一个快速的修改,这样我就可以得到一个返回的温度值。我这样做是为了演示如何更新文本小部件,其中包括添加一个只返回随机值的新函数。你知道吗
现在,正如您看到的,当我们运行上面的程序时,我们得到的结果基本上与您原来的程序相同。温度是读取(读取:随机生成),然后小部件被更新,然后。没什么别的了。你知道吗
所以,首先我们需要找到在哪里使用
after()
。有很多方法可以做到这一点,但最简单的方法(主观上,在这个例子中)。在可能的情况下,我建议改用class
来添加新函数,如下所示:让我们一行一行地看这个。你知道吗
我们遇到的第一个新行(运行时,而不是阅读时)是对我定义的新函数的调用,说到这个函数。你知道吗
这个函数的第一行。你知道吗
。只是告诉程序去获取新的温度,并将其指定为label小部件的
text
属性aktTemp
。这是在GUI中实际进行更改的行。你知道吗另一方面,这条线。你知道吗
。是上面提到的
after
的用法。所有这些都是说“每1000毫秒,调用函数update()
”,正如我们从上面所知道的那样,它会将标签更新为新的温度,并在再次调用自身之前启动另一个1000毫秒的延迟。你知道吗You can read more about ^{} here.
不幸的是,要正确地执行此操作,必须至少定义一个新函数。我赞赏@EthanField的详细解释(+1),但下面是我使用Tk的跟踪功能的替代实现:
相关问题 更多 >
编程相关推荐