Tkinter文本框实时展示Telnet传感器数据流的实现与问题解决
实现Telnet传感器数据在Tkinter文本框实时展示的解决方案
需求:连接无需账号密码的Telnet服务,获取传感器检测到物体时持续更新的文本数据,并在Tkinter文本框中实时展示。
初始尝试与问题
最初通过线程调用telnetlib.read_all()读取数据,但无法实现实时更新,代码如下:
from tkinter import * import threading import telnetlib HOST = "192.168.10.19" window = Tk() window.title("Title") window.geometry("810x600") class TrafficData: global window def __init__(self): self.out_text = Text(height=10, width=100) self.out_text.grid(row=2, column=0, columnspan=4, pady=1, padx=1) self.connect_Button = Button(text="Connect", command=self.connect) self.connect_Button.grid(row=3, column=0, pady=1, padx=1) def connect(self): # 注:原代码线程创建写法有误,需指定target参数 t1 = threading.Thread(target=self.connectCall) t1.start() def connectCall(self): with telnetlib.Telnet(HOST, 6000) as tn: self.out_text.insert(window, str(tn.read_all())) if __name__ == '__main__': atcc = TrafficData() window.mainloop()
问题核心:read_all()会等待Telnet连接完全关闭后,才一次性返回所有接收的数据,无法做到实时逐行展示。
最终可行方案
通过telnetlib.read_until(b"\n")结合循环实现逐行读取,每次读取到换行符就更新文本框,同时调用update()强制刷新UI,保证实时性。核心代码如下:
with telnetlib.Telnet(HOST, 6000) as tn: self.atcc_Out_text.insert(END, "Connected \n") while run_token: self.dataRec = tn.read_until(b"\n") self.atcc_Out_text.insert(END, self.dataRec.decode('ascii')) self.atcc_Out_text.update() self.dataRec = ""
关键说明:
read_until(b"\n"):阻塞等待直到读取到换行符,每次获取一行传感器数据update():强制Tkinter文本框刷新,确保新插入的数据立即显示run_token:作为循环控制变量,可用于后续添加断开连接逻辑,终止数据读取循环
内容的提问来源于stack exchange,提问作者Prashant soni
相关产品推荐
相关产品推荐

