Динамическое обновление окна Tkinter на основе последовательных данных

Я пытаюсь написать программу, которая получает данные из соединения через последовательный порт и автоматически обновляет окно Tkinter в реальном времени на основе этих данных.

Я попытался создать отдельный поток для окна, который периодически получает текущие данные из основного потока и обновляет окно, например:

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()

Запуск выдает следующую ошибку:

Исключение в потоке Thread-2 : Traceback (последний последний вызов): Файл "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", строка 522, в __bootstrap_inner самозапуск() Файл "analysis.py", строка 52, выполняется селф.фунт1.пакет() Файл "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk/Tkinter.py", строка 1764, в пакете_configure + self._options(cnf, кВт)) RuntimeError: основной поток не находится в основном цикле

Когда я гуглю эту ошибку, я в основном получаю сообщения, в которых люди пытаются взаимодействовать с окном из двух разных потоков, но я не думаю, что делаю это. Любые идеи? Большое спасибо!

5
задан user1363445 13 May 2012 в 20:08
поделиться