【问题标题】:Tkinter: displaying label with automatically updated variableTkinter:显示带有自动更新变量的标签
【发布时间】:2019-04-18 09:27:26
【问题描述】:

我知道关于这个主题有很多问题,但经过长时间的研究,我没有找到任何可以解决我的问题的问题。

我正在尝试使用标签(使用 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()

有人有正确的语法吗?

【问题讨论】:

    标签: python-3.x tkinter label updates


    【解决方案1】:

    如何使用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)
    

    【讨论】:

      【解决方案2】:

      after 具有以下语法:

      之后(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)
      

      【讨论】:

      • root.after 不应该在 if 语句之外吗?否则只有当 if 条件为真时才会安排回调。
      猜你喜欢
      • 1970-01-01
      • 2011-02-05
      • 2014-07-31
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多