Python 3.x Tkinter串行读取
我无法通过串行连接读取来自arduino的串行数据。为了解决串行和gui需要同时运行的问题,我使用.after函数每100ms调用一次更新串行。然而,当我运行这段代码时,没有弹出窗口,并且我得到一个错误,说我已经超过了最大递归深度。这是我的密码:Python 3.x Tkinter串行读取,python,python-3.x,tkinter,serial-port,Python,Python 3.x,Tkinter,Serial Port,我无法通过串行连接读取来自arduino的串行数据。为了解决串行和gui需要同时运行的问题,我使用.after函数每100ms调用一次更新串行。然而,当我运行这段代码时,没有弹出窗口,并且我得到一个错误,说我已经超过了最大递归深度。这是我的密码: ''' Created on Nov 23, 2014 @author: Charlie ''' if __name__ == '__main__': pass import serial from tkinter import * s
'''
Created on Nov 23, 2014
@author: Charlie
'''
if __name__ == '__main__':
pass
import serial
from tkinter import *
ser = serial.Serial('COM8')
ser.baudrate = 9600
def update():
c = StringVar()
c=ser.readline()
theta.set(c)
root.after(100,update())
root=Tk()
theta = StringVar()
w = Label(root, textvariable = theta)
w.pack()
root.after(100,update())
root.mainloop()
在funcupdate()
中删除循环root.after(100,update())
。这:
def update():
c = StringVar()
c=ser.readline()
theta.set(c)
您应该使用root.after(100,update)。注意
update
之后缺少括号。使用括号将update
的结果发送到after
调用,但要计算结果,必须运行update
,其中包含另一个对after
的调用,该调用需要update
的结果,依此类推
另见
另外,为什么每次调用update
函数时都要创建一个新的StringVar
c=ser.readline()
无论如何都会覆盖c
,因此您最好删除该行。我的目的是在调用该行时重置下一个更新调用。否则,我的更新不会只被调用一次吗?在调用主循环之前一次。如果读取funcupdate()
中的数据以更好地更新标签,则不会有无限循环反复调用它。这是:“w.after(100,update())”,如果是func,则返回值。