我知道关于这个主题有很多问题,但是经过长期的研究,我没有找到任何可以解决我问题的方法。
我试图用标签显示(使用tkinter)从I²C总线获得的变量。因此,该变量会非常有规律地自动更新。窗口的其余部分应保持对用户可用。
就目前而言,我发现显示带有已更新变量的标签并使用户可以使用其余窗口的唯一方法是:
window = tk.Tk()
window.title("Gestionnaire de périphériques")
window.minsize(1024,600)
labelValThermo = tk.Label(a_frame_in_the_main_window,text = "")
labelValThermo.grid(row = 1, column = 1)
while True:
if mcp.get_hot_junction_temperature() != 16.0625:
labelValThermo.configure(text = "Température thermocouple: {} °C".format(mcp.get_hot_junction_temperature()))
window.update()
time.sleep(0.75)
来自I²C并已更新的变量为mcp.get_hot_junction_temperature
事实是,我知道这不是强制无限循环更新的最佳方法。这应该是mainloop()
的角色。我发现after()
方法可以解决我的问题,但是我不知道如何运行它。我尝试了以下无效的代码:
def displayThermoTemp():
if mcp.get_hot_junction_temperature() != 16.0625:
labelValThermo.configure(text = "Température thermocouple: {} °C".format(mcp.get_hot_junction_temperature()))
labelValThermo.after(500,displayThermoTemp)
window = tk.Tk()
labelValThermo = tk.Label(thermoGraphFrame,text = "")
labelValThermo.after(500, displayThermoTemp)
labelValThermo.grid(row = 1, column = 1)
window.mainloop()
有人语法正确吗?
答案 0 :(得分:2)
如何使用after()
?
after()
在以毫秒为单位的给定延迟后调用函数回调。只要在给定的函数中定义它,它就会像while循环一样运行,直到您调用after_cancel(id)
为止。
以下是示例:
import tkinter as tk
Count = 1
root = tk.Tk()
label = tk.Label(root, text=Count, font = ('', 30))
label.pack()
def update():
global Count
Count += 1
label['text'] = Count
root.after(100, update)
update()
root.mainloop()
以此更新您的函数,并在mainloop()
之前调用它一次。
def displayThermoTemp():
if mcp.get_hot_junction_temperature() != 16.0625:
labelValThermo.configure(text = "Température thermocouple: {} °C".format(mcp.get_hot_junction_temperature()))
labelValThermo.after(500,displayThermoTemp)
# 100ms = 0.1 secs
window(100, displayThermoTemp)
答案 1 :(得分:2)
之后具有以下语法:
之后(delay_ms,callback = None,* args)
您需要将命令放置在回调函数中,并更新小部件所在的窗口(在您的情况下,labelValThermo
似乎位于root
窗口中:
def displayThermoTemp():
if mcp.get_hot_junction_temperature() != 16.0625:
labelValThermo.configure(text = "Température thermocouple: {} °C".format(mcp.get_hot_junction_temperature()))
root.after(500,displayThermoTemp)