我正在尝试使用以下代码从arduino串行读取并每隔几秒更新一次带有该数据的标签。
当我运行代码时,它只获取/更新标签一次。所以我知道它与循环有关。我的理解是Tk()
和mainloop()
之间的所有代码都在循环中。任何帮助将不胜感激。
from Tkinter import *
import serial
import time
def show_values():
arduinoSerialData.write("55")#Write some data to test Arduino read serial and turn on LED if it does
arduinoSerialData = serial.Serial('/dev/cu.usbmodem1461', 9600, timeout=None)
time.sleep(5) #Arduino Serial Reset Timeout
Joes = Tk()
Joes.wm_title("Read Serial")
myData= arduinoSerialData.readline()
temp = float(myData) #convert string to float store in var
templabel = Label(Joes, text=(temp))
templabel.pack()
c = Button(Joes, text="Send Data", command=show_values)
c.pack()
time.sleep(2)
Joes.mainloop()
答案 0 :(得分:1)
您似乎误解了TK主循环的工作原理。正如您所描述的那样,它不是在调用Tk()
和mainloop()
之间的循环,而是在程序代码外部的Tkinter中。
为了有一个循环,更新标签,你必须使用Tk的after
方法专门编写一个循环,一遍又一遍地调用一个可迭代的函数。
你可以像这样做一个你想做的事情:
def update_label():
data= float(arduinoSerialData.readline())
templabel.config(text=str(data)) #Update label with next text.
Joes.after(1000, update_label)
#calls update_label function again after 1 second. (1000 milliseconds.)
我不确定如何检索arduino数据,因此您可能需要稍微修改以获得正确的数据。 这是一个通用前提,但是以您描述的方式创建循环。