在tkin中永久更改标签值

2024-09-23 06:39:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在我的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.读取当前温度()-它将返回当前温度,因此我希望标签根据此函数调用每秒刷新一次。你知道吗


Tags: 函数importas动态guiroot标签温度
2条回答

因此,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")

。只是告诉程序去获取新的温度,并将其指定为label小部件的text属性aktTemp。这是在GUI中实际进行更改的行。你知道吗

另一方面,这条线。你知道吗

    aktTemp.after(1000, update)

。是上面提到的after的用法。所有这些都是说“每1000毫秒,调用函数update()”,正如我们从上面所知道的那样,它会将标签更新为新的温度,并在再次调用自身之前启动另一个1000毫秒的延迟。你知道吗


You can read more about ^{} here.

不幸的是,要正确地执行此操作,必须至少定义一个新函数。我赞赏@EthanField的详细解释(+1),但下面是我使用Tk的跟踪功能的替代实现:

import tkinter as tk
from src import SerialPort as sp

WIDTH, HEIGHT = 500, 300

def refresh_temperature(string):
    temperature.set(string.format(sp.read_current_Temperature()))
    root.after(1000, refresh_temperature, string)

root = tk.Tk()

canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH)
canvas.pack()

temperature = tk.StringVar()

aktTemp = tk.Label(root, textvariable=temperature, fg="red")
aktTemp.pack()

refresh_temperature("{} °C")

root.mainloop()

相关问题 更多 >