【问题标题】:Python 3.x Tkinter Serial ReadingPython 3.x Tkinter 串行读取
【发布时间】:2014-11-24 06:18:22
【问题描述】:

我很难通过串行连接读取来自 arduino 的串行数据。为了解决串行问题和需要同时运行的 gui,我使用 .after 函数每 100 毫秒调用一次更新串行。但是,当我运行此代码时,我没有弹出任何窗口,并且我收到一条错误消息,指出我已超出最大递归深度。这是我的代码:

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

【问题讨论】:

    标签: python python-3.x tkinter serial-port


    【解决方案1】:

    您应该使用root.after(100, update)。注意update 后面没有括号。使用括号将update 的结果发送到after 调用,但要计算结果,必须运行update,其中包含对after 的另一个调用,它需要update 的结果等等。 .

    另见this question

    另外,为什么每次调用update 函数时都创建一个新的StringVar
    c = ser.readline() 无论如何都会覆盖c,所以你也可以删除该行。

    【讨论】:

      【解决方案2】:

      在函数update() 中删除循环root.after(100,update())。这个:

      def update():
          c = StringVar()
          c=ser.readline()
          theta.set(c)
      

      【讨论】:

      • 我的意图是在我调用时重置下一次更新调用。否则,我的更新不会只被调用一次吗?在调用主循环之前一次。不会有一次又一次地调用它的无限循环。
      • 如果你读到 func update() 中的数据以更好地更新标签。这:'w.after(100, update())',如果你是 func 返回值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2012-03-20
      • 2015-01-09
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多