Tkinter:使用after()使函数周期性运行



我试图让一个函数定期运行。目的是在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毫秒之前被调用。

相关内容

  • 没有找到相关文章

最新更新