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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:33:27