【发布时间】:2021-04-10 07:59:01
【问题描述】:
我正在使用带有 tkinter gui 的 pychem 通过串行通信从 arduino 收集数据并显示在 tkinter 窗口上。该脚本在启动时运行良好,但 tkinter gui 窗口冻结并在几分钟后停止更新值。在研究了一段时间后,我意识到冻结所需的时间与从 arduino 收集的数据数量直接相关。如果我每 0.1 秒发送一次数据,窗口会在 8 分 30 秒后完全冻结,如果我每 0.2 秒发送一次数据,时间几乎翻了一番。即使在窗口被冻结后,串行通信仍然可以正常工作,并且 python 脚本正在收集数据,但只是没有在 tkinter 窗口上更新。 任何建议表示赞赏。我已经有一段时间了。我尝试过线程,但也出现了同样的问题。
import tkinter as tk
import tkinter
from tkinter import *
import time
import serial
root = tk.Tk()
root.geometry("500x500")
ser = serial.Serial('COM10', 9600)
def write_read(x):
ser.write(bytes(x, 'utf-8'))
time.sleep(0.001)
data = ser.readline()
return data
while True:
xv = '1'
yv = '2'
xvalue = StringVar()
xvalue.set(write_read(xv))
yvalue = StringVar()
yvalue.set(write_read(yv))
w = tk.Label(root, text="X").place(x=10, y=10)
w1 = tk.Label(root, text="Y").place(x=10, y=40)
display1 = Entry(root, font=("Courier", 16), justify='right', textvariable=xvalue).place(x=50, y=10)
display2 = Entry(root, font=("Courier", 16), justify='right', textvariable=yvalue).place(x=50, y=40)
root.update_idletasks()
root.update()
【问题讨论】:
-
我们必须查看您的代码才能在此处提供任何帮助。假设您的代码如何工作对您没有好处。所以请发布一些代码;D
-
我刚刚发布了代码。如果您有任何建议,请告诉我。我向 arduino 发送一个号码,然后根据该号码,arduino 发回一个数据。
-
将
xvalue、yvalue、w、w1、display1和display2移到循环外。冻结的原因也是time.sleep()。 -
@CoolCloud 非常感谢。这工作得很好。
标签: python tkinter arduino pyserial