动态更新 Tkinter 小部件

问题描述 投票:0回答:1

对于控制连接到 Raspberry 的各种传感器的应用程序,我创建了一个 Python 脚本,该脚本通过在使用 tkinter 创建的图形界面的一些标签上报告这些值来读取和更新各种传感器的值。

图形界面由“开始”按钮和各种标签组成,用于收集各种传感器读取的值。

通过点击相关例程中的“开始”,除了各种配置操作和各种设置之外,还可以顺序读取大约二十个模拟传感器的值并将其写入与各个传感器相关的标签中。

我遇到的问题是,标签仅在“开始”按钮管理例程结束时重新进入主循环时更新,因此该脚本在控制和读取传感器值方面工作正常,并且在最后我更新了情况值,不幸的是,由于传感器的读取需要一定的时间,大约 20 秒,您会感觉一旦单击“开始”,20 秒内没有任何反应(有时甚至更长,因为某些传感器可以有更长的响应)次)。

为了进行一些检查,我编写了一个非常轻的脚本,我在下面报告(包含所有传感器管理部分的生产脚本非常重):

import time
import tkinter as tk
from tkinter import ttk

def StartMain():
    for i in range(10):
        time.sleep(1)
        lbl01.config(text=i)
        print(i)
    
def ResMain():
            lbl01.config(text="")

mainw = tk.Tk()
mainw.title("SyncLBL")
mainw.geometry("500x100+400+300")
mainw.resizable(False, False)

lbl01 = ttk.Label(text="",borderwidth=5, relief="ridge")
lbl01.grid(column=3, row=1,sticky="EW",padx=5,pady=2,ipadx=50, ipady=5)

StartButton=ttk.Button(text="START",command=StartMain)
StartButton.grid(column=0,row=3,sticky="EW",padx=5,pady=2,ipadx=50, ipady=5)

ResButton=ttk.Button(text="RESET",command=ResMain)
ResButton.grid(column=5,row=3,sticky="EW",padx=5,pady=2,ipadx=50, ipady=5)
mainw.mainloop()

当我单击控制台中的 START 按钮时,我看到计数每秒都在增加,而接口标签仅在 START 例程结束时更新为最后的计数值。

如何在计数继续时看到标签的更新?

python tkinter
1个回答
0
投票

如果您的传感器花费的时间超过几百毫秒,则创建响应式 GUI 的唯一方法是在单独的线程或进程中检查传感器。

您可以启动一个线程来收集数据,然后立即返回,以便

mainloop
可以继续处理事件。当数据准备好时,另一个线程可以向主线程发送虚拟事件。然后,您可以绑定到主线程中的虚拟事件,以从线程安全队列中获取数据并更新 UI。或者,您的主 GUI 线程只需每隔几百毫秒轮询一次队列,并在数据准备好时更新 UI。

© www.soinside.com 2019 - 2024. All rights reserved.