实时 Tkinter 标签
Live Tkinter Labels
我有一个关于 tkinter 标签和 pymodbus 的问题。场景是,我正在尝试构建一个 GUI,程序借此连接到“串行客户端”或“从属”设备,并实质上轮询串行客户端寄存器。我正在尝试读取这些寄存器并将它们显示在我能够做到的 tkinter 标签上!但是,我想更进一步,让标签每秒更新一次。有问题的寄存器是传感器,所以我想在它们变化时捕获它们,并将它们显示在 GUI 上。到目前为止,这是已完成内容的简化版本。
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from pymodbus.client.sync import ModbusSerialClient
client = ModbusSerialClient(
port="COM14",
startbit=1,
databits=8,
parity="N",
stopbits=2,
errorcheck="crc",
baudrate=38400,
method="RTU",
timeout=3)
root = Tk()
root.geometry("500x350")
res = client.read_holding_registers(address=50, count=1, unit=1)
value_1 = DoubleVar()
value_1.set(res.registers)
value_label = ttk.Label(root, textvariable = value_1, font = ("Arial", 25, "bold"))
value_label.place(x = 50, y = 50)
root.mainloop()
目前,程序连接到有问题的传感器并在程序加载时从寄存器中获取值,有没有办法每秒轮询一次值并更新?
提前致谢。
您可以使用.after()
执行一个函数来每秒轮询寄存器:
...
value_1 = DoubleVar()
value_label = ttk.Label(root, textvariable=value_1, font=("Arial", 25, "bold"))
value_label.place(x=50, y=50)
def poll_register():
res = client.read_holding_registers(address=50, count=1, unit=1)
value_1.set(res.registers)
# call poll_register() again one second later
root.after(1000, poll_register)
poll_register() # start polling register
...
我有一个关于 tkinter 标签和 pymodbus 的问题。场景是,我正在尝试构建一个 GUI,程序借此连接到“串行客户端”或“从属”设备,并实质上轮询串行客户端寄存器。我正在尝试读取这些寄存器并将它们显示在我能够做到的 tkinter 标签上!但是,我想更进一步,让标签每秒更新一次。有问题的寄存器是传感器,所以我想在它们变化时捕获它们,并将它们显示在 GUI 上。到目前为止,这是已完成内容的简化版本。
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from pymodbus.client.sync import ModbusSerialClient
client = ModbusSerialClient(
port="COM14",
startbit=1,
databits=8,
parity="N",
stopbits=2,
errorcheck="crc",
baudrate=38400,
method="RTU",
timeout=3)
root = Tk()
root.geometry("500x350")
res = client.read_holding_registers(address=50, count=1, unit=1)
value_1 = DoubleVar()
value_1.set(res.registers)
value_label = ttk.Label(root, textvariable = value_1, font = ("Arial", 25, "bold"))
value_label.place(x = 50, y = 50)
root.mainloop()
目前,程序连接到有问题的传感器并在程序加载时从寄存器中获取值,有没有办法每秒轮询一次值并更新?
提前致谢。
您可以使用.after()
执行一个函数来每秒轮询寄存器:
...
value_1 = DoubleVar()
value_label = ttk.Label(root, textvariable=value_1, font=("Arial", 25, "bold"))
value_label.place(x=50, y=50)
def poll_register():
res = client.read_holding_registers(address=50, count=1, unit=1)
value_1.set(res.registers)
# call poll_register() again one second later
root.after(1000, poll_register)
poll_register() # start polling register
...