如何让Tkinter GUI为串行数据工作

2024-09-30 20:32:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个简单的gui中显示串行数据。串行数据是动态的(温度传感器)。 这是我在tkinter中为GUI编写的代码,但是第9行出现了抛出错误

from time import sleep
import threading
import serial
from tkinter import *
serialdata = []
data = True
class SensorThread(threading.Thread):
    def run(self):
        seri_=serial.Serial('/dev/ttyACM0', 9600)
        try:
            i = 0
            while True:
                serialdata.append(seri_.readline())
                i += 1
                sleep(1)
        except KeyboardInterrupt:
            exit()
class Gui(object):
    def __init__(self):
        self.root = Tk()
        self.lbl = Label(self.root, text="")
        self.updateGUI()
        self.readSensor()
    def run(self):
        self.lbl.pack()
        self.lbl.after(1000, self.updateGUI)
        self.root.mainloop()
    def updateGUI(self):
        msg = "Data is True" if data else "Data is False"
        self.lbl["text"] = msg
        self.root.update()
        self.lbl.after(1000, self.updateGUI)
    def readSensor(self):
        self.lbl["text"] = serialdata[-1]
        self.root.update()
        self.root.after(527, self.readSensor)
if __name__ == "__main__":
    SensorThread().start()
    Gui().run()

运行此代码时,我收到了此错误。请任何人帮助解决这个问题:

回溯(最近一次呼叫最后一次): File "ts.py", line 39, in <module> Gui().run() File "ts.py", line 23, in __init__ self.readSensor() File "ts.py", line 34, in readSensor self.lbl["text"] = serialdata[0] IndexError: list index out of range


Tags: runtextimportselftruedefguiroot
1条回答
网友
1楼 · 发布于 2024-09-30 20:32:15

下面的示例将使is工作。刚才添加了一个try{},以确保serialdata不是空的。我用一个函数替换了SensorThread,该函数每隔一秒钟向serialdata添加一个介于0和100之间的随机整数

import random
from time import sleep
import threading
from tkinter import *

serialdata = []
data = True

class SensorThread(threading.Thread):
    def run(self):
        while True:
            sleep(1)
            serialdata.append(random.randint(0, 100))


class Gui(object):
    def __init__(self):
        self.root = Tk()
        self.lbl = Label(self.root, text="")
        self.updateGUI()
        self.readSensor()

    def run(self):
        self.lbl.pack()
        self.lbl.after(1000, self.updateGUI)
        self.root.mainloop()

    def updateGUI(self):
        msg = "Data is True" if data else "Data is False"
        self.lbl["text"] = msg
        self.root.update()
        self.lbl.after(1000, self.updateGUI)

    def readSensor(self):
        try:
            self.lbl["text"] = serialdata[-1]
        except IndexError:
            pass

        self.root.update()
        self.root.after(527, self.readSensor)

if __name__ == "__main__":
    SensorThread().start()
    Gui().run()

相关问题 更多 >