Dynamically updating Tkinter window based on serial data

后端 未结 2 2035
悲&欢浪女
悲&欢浪女 2020-12-05 21:47

I\'m trying to write a program that gets data from a serial port connection and automatically updates the Tkinter window in real time based on that data.

I tried to

2条回答
  •  南方客
    南方客 (楼主)
    2020-12-05 22:45

    Don't run the TK gui from a thread - run it from the main process. I mashed your example into something that demonstrates the principle

    from time import sleep
    import threading
    from Tkinter import *
    
    serialdata = []
    data = True
    
    class SensorThread(threading.Thread):
        def run(self):
            try:
                i = 0
                while True:
                    serialdata.append("Hello %d" % i)
                    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()
    

提交回复
热议问题