Python中Tkinter GUI如何每5秒更新显示从OPC服务器采集的数据
Tkinter OPC数据定时更新解决方案
核心问题原因
Tkinter的界面渲染、用户交互事件响应全部依赖主线程的mainloop事件循环,你原有代码中的无限while循环+time.sleep(5)逻辑会完全阻塞主线程,代码永远无法执行到master.mainloop()步骤,因此GUI窗口无法正常加载渲染。
可行实现方案
使用Tkinter内置的after()方法实现定时任务,该方法可以在不阻塞主线程事件循环的前提下,间隔指定时长执行自定义函数,完美适配你的5秒更新需求。
修改后完整代码
#!/usr/bin/env python # -*- coding: utf-8 -*- import Tkinter from opcua import Client # OPC连接初始化 url = "opc.tcp://xxxxxxx" client = Client(url) client.connect() # 主窗口初始化 master = Tkinter.Tk() master.title("GUI Raspberry") master.geometry("900x900") # 标签初始化,pack只需要执行一次,不要放在定时更新逻辑里 label = Tkinter.Label(master, text='test') label2 = Tkinter.Label(master, text='') label.pack(padx = 5, pady = 10, side = Tkinter.LEFT) label2.pack(padx = 5, pady = 20, side = Tkinter.LEFT) # 定义OPC数据更新函数 def update_opc_data(): Mean = client.get_node("ns=2;i=3") MeanValue = Mean.get_value() label2['text'] = MeanValue print(MeanValue) # 执行完一次更新后,再次注册5秒后的定时任务,实现循环更新 master.after(5000, update_opc_data) # 首次调用更新函数,启动定时任务链 update_opc_data() # 启动主线程事件循环 master.mainloop() # 窗口关闭后断开OPC连接 client.disconnect()
注意事项
after()方法第一个参数为间隔时长,单位为毫秒,5秒对应填入5000- 禁止在Tkinter主线程中使用
time.sleep(),该方法会阻塞整个界面的响应 - 标签的
pack()方法只需要在初始化时执行一次,多次重复调用会导致界面布局异常 - 窗口关闭后主动调用
client.disconnect()释放OPC连接,避免服务端残留无效连接
内容的提问来源于stack exchange,提问作者Aless
相关产品推荐
相关产品推荐

