问题描述
我正在尝试以简单的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
解决方法
下面的示例将使工作正常。刚刚添加了try
except IndexError
,以确保serialdata
不为空。我用每秒钟向串行数据添加0到100之间的随机整数的函数替换了SensorThread。
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()