You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:48:04