Sto provando a scrivere un programma che ottiene i dati da una porta seriale e aggiorna automaticamente la finestra di Tkinter in tempo reale sulla base di tali dati.Aggiornamento dinamico della finestra di Tkinter basata sui dati seriali
Ho cercato di creare un thread separato per la finestra che ottiene periodicamente i dati correnti dal thread principale e aggiorna la finestra, in questo modo:
serialdata = []
data = True
class SensorThread(threading.Thread):
def run(self):
serial = serial.Serial('dev/tty.usbmodem1d11', 9600)
try:
while True:
serialdata.append(serial.readline())
except KeyboardInterrupt:
serial.close()
exit()
class GuiThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.root = Tk()
self.lbl = Label(self.root, text="")
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)
if __name == "__main__":
SensorThread().start()
GuiThread().start()
try:
while True:
# A bunch of analysis that sets either data = True or data = False based on serialdata
except KeyboardInterrupt:
exit()
esecuzione mi dà questo errore:
Exception in thread Thread-2: Traceback (most recent call last): File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner self.run() File "analysis.py", line 52, in run self.lbl1.pack() File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk/Tkinter.py", line 1764, in pack_configure + self._options(cnf, kw)) RuntimeError: main thread is not in main loop
Quando provo questo errore, per lo più ottengo post in cui le persone cercano di interagire con la finestra da due thread diversi, ma non credo che lo stia facendo. Qualche idea? Grazie mille!
Hai provato a eseguire la parte TK non in una discussione? Cioè, eseguo la porta seriale in una discussione e la roba di TK può rimanere nel processo principale. Sospetto che potrebbe funzionare ... –
Come un thread per ottenere i dati della porta seriale e un altro thread per il ciclo di analisi dei dati? Darò un colpo. – user1363445