在使用 pyserial 和 Arduino 时面临 TkInter 的问题

Posted

技术标签:

【中文标题】在使用 pyserial 和 Arduino 时面临 TkInter 的问题【英文标题】:Facing problems with TkInter when working with pyserial and Arduino 【发布时间】:2017-06-19 08:42:02 【问题描述】:

我对 Python 完全陌生,我正在使用 pyserial 从 Arduino 读取数据并使用 TkInter 创建一个 GUI,它在 GUI 的文本框中显示来自 arduino 的数据。

我正在使用这个 Python 代码:

from tkinter import *
from tkinter import ttk
import serial
import time

def disp():
    ser = serial.Serial('COM1', baudrate = 9600, timeout=1)
    time.sleep(1)
    arduinoData = (ser.readline().strip())
    a=arduinoData.decode('utf-8')
    dispe.delete(0,"end")
    dispe.insert(0, a)

def dis(event):
    disp()

root=Tk()
button=Button(root,text="press")
button.bind("<Button-1>",dis)
button.pack(side=LEFT)
dispe=Entry(root)
dispe.pack(side=LEFT)
root.mainloop()

这段代码工作得很好。当我单击 GUI 上的按钮时,它会显示从 Arduino 接收到的值。这个程序需要用户一次又一次的点击来获取值,但是我想添加一个while循环,这样我就不需要连续点击一次了。关键是让用户只点击一次按钮。

但是当我在time.sleep 之后插入一个while True: 循环以不断更新从 Arduino 接收到的值时,文本框上不会显示任何内容...

【问题讨论】:

相关:tkinter: how to use after method 如果您不希望用户连续点击按钮,那么使用 Button 小部件是错误的继续操作方式。我会简单地将 while 放在函数之外,并在上述 while 中调用适当的函数。 但问题是我希望用户只按一次按钮,这就是整个想法 你不应该使用无限循环,因为 Tkinter 已经有一个无限循环。检查链接的问题。 after 方法就是你要找的。​​span> 是的,谢谢@Lafexlos。我使用 'root.after()' 为我工作,而不是那个无限的 while 循环。现在我的程序工作得很好!非常感谢!! 【参考方案1】:

这是正确的代码:-

from tkinter import *
from tkinter import ttk
import serial
import time


def disp():

    ser = serial.Serial('COM1', baudrate = 9600, timeout=1)


    time.sleep(1)

    arduinoData = (ser.readline().strip())
    a=arduinoData.decode('utf-8')

    dispe.delete(0,"end")
    dispe.insert(0, a)
    root.after(1, disp)    

def dis(event):
    root.after(0, disp)

root=Tk()

L1 = Label(root, text="Press the button to get data from the arduino       ")
L1.pack(side=LEFT)

button=Button(root,text="press")
button.bind("<Button-1>",dis)
button.pack(side=LEFT)

dispe=Entry(root)
dispe.pack(side=LEFT)

root.mainloop()

【讨论】:

以上是关于在使用 pyserial 和 Arduino 时面临 TkInter 的问题的主要内容,如果未能解决你的问题,请参考以下文章

arduino 使用 pySerial 打开/关闭 LED

重新打开后,arduino 和 pyserial 之间的串行连接变慢

使用 Arduino 和 PySerial 回显一系列字节

PySerial + Arduino MEGA 1 秒延迟/响应时间

使用 PySerial 和 Arduino Uno 的时序问题

通过 pySerial 通过 Python 控制 Arduino