我试图让一个函数定期运行。目的是在tkinter帧上打印串行数据。
一开始使用线程是可行的。
def readSerial():
global val1
ser_bytes = ser.readline()
ser_bytes = ser_bytes.decode("utf-8")
val1 = ser_bytes
scrollbar.insert("end", val1)
scrollbar.see("end") #autoscroll to the end of the scrollbar
t1 = continuous_threading.PeriodicThread(0.1, readSerial)
frame2 = tk.Frame(root, bg='#80c1ff') #remove color later
frame2.place(relx=0, rely=0.1, relheight=1, relwidth=1, anchor='nw')
scrollbar = scrolledtext.ScrolledText(frame2)
scrollbar.place(relx=0, rely=0, relheight=0.9, relwidth=1, anchor='nw')
t1.start()
root.mainloop()
然而,当我关闭我的应用程序时,我遇到了错误。你可以在这里读到更多:关闭我的tkinter串行应用程序,给我一个异常
所以用户AST建议,我应该使用after()
函数。
所以我试了这个:
我保持函数readSerial()
完全相同。我删除了所有涉及线程(t1
)的行。
最后这个:
root.after(100, readSerial)
root.mainloop()
但这并不像预期的那样工作。
在我的tkinter框架中,只打印序列的第一行,然后不打印其他内容。
我怎么能使这个工作与after()
?正确的方法是什么?
您必须在函数内部使用after()
以便定期调用它,如:
def readSerial():
global val1
ser_bytes = ser.readline()
ser_bytes = ser_bytes.decode("utf-8")
val1 = ser_bytes
scrollbar.insert("end", val1)
scrollbar.see("end") #autoscroll to the end of the scrollbar
root.after(100,readSerial) # 100 ms is 0.1 second, you can change that
.... # Same code but remove the t1
readSerial()
root.mainloop()
这将保持大约每100毫秒重复一次函数,不能保证在100毫秒精确地调用函数,但它不会在100毫秒之前被调用。