我用tkinter编写了一个gui,我需要实时将2个音阶的值发送给arduino。我已经验证了arduino正在使用另一个草图,它将值发送到arduino并收到这些草图,我在下面的代码中添加了我的python代码
while True:
#command = raw_input("Enter level ")
#if command == '1' :
ser.write("c"+str (c1v.get()))
ser.write(":d"+str (c2v.get()))
我已经移动了tkinter主循环的内部和外部,并且从gui没有加载到仅在gui关闭时发送的数据得到不同的结果。有人可以告诉我如何让gui运行,当我移动一个比例时,值会通过串行实时发送到arduino。
继承人代码:
from Tkinter import *
import serial
ser = serial.Serial('/dev/ttyAMA0', 9600)
master= Tk()
master.geometry('500x500+0+0')
def print_value(val):
print ("c1="+str (c1v.get()))
print ("c2="+str(c2v.get()))
c1v=DoubleVar()
c2v=DoubleVar()
c1 = Scale(master, from_=255, to=0, length =400,width =100, troughcolor = 'blue',command=print_value, variable =c1v)
c1.grid(row=1,column=1)
c2 = Scale(master, from_=255, to=0, length =400,width =100, troughcolor = 'blue',command=print_value, variable =c2v)
c2.grid(row=1,column=2)
def load_p1():
pass
lp1 = open("/home/pi/Desktop/IEP/test/preset_test.txt")
val1, val2 = (x.split("=")[1] for x in lp1)
c1.set(val1)
c2.set(val2)
lp1.close()
#
def record():
save_path = '/home/pi/Desktop/IEP/test'
name_of_file = ("preset_test")
completeName = os.path.join(save_path, name_of_file+".txt")
file1 = open(completeName , "w")
toFile = ("c1="+str (c1.get())+ "\n""c2="+str(c2.get()))
file1.write(toFile)
file1.close()
rec=Button(master, text="Record",width=20, height=10, bg='Red', command=record)
rec.grid(row=2, column=1)
load=Button(master, text="Load",width=20, height=10, bg='gold',command=load_p1)
load.grid(row=2, column=2)
master.mainloop()
while True:
#command = raw_input("Enter level ")
#if command == '1' :
ser.write("c"+str (c1v.get()))
ser.write(":d"+str (c2v.get()))
答案 0 :(得分:3)
<强>上下文强>
您使用Tkinter mainloop
和while
循环,现在您想将它们放在一个程序中。
while X:
do_y()
和
master.mainloop()
<强>解决方案强>
您可以使用多种解决方案。
拆分循环并使用after
让GUI回电:
def do_y2():
do_y()
if X:
master.after(123, do_y2) # after 123 milli seconds this is called again
do_y2()
master.mainloop()
有关更详细的答案,请参阅this answer
由我使用guiLoop。
from guiLoop import guiLoop # https://gist.github.com/niccokunzmann/8673951#file-guiloop-py
@guiLoop
def do_y2():
while X:
do_y()
yield 0.123 # give the GUI 123 milli seconds to do everything
do_y2(master)
master.mainloop()
guiLoop使用1.中的方法,但允许您使用一个或多个while循环。
使用update
刷新GUI。
while X:
do_y()
master.update()
这种方法很不寻常,因为它取代了像Tkinter这样的大多数GUI框架的主循环。请注意,对于1和2,您可以有多个循环,而不仅仅是3中的一个。
使用一个执行并行执行循环的新执行线程。 !该线程不能直接访问master或任何GUI元素,因为Tkinter可能会崩溃!
import threading
def do_y_loop():
while X:
do_y()
thread = threading.Thread(target = do_y_loop)
thread.deamon = True # use this if your application does not close.
thread.start()
master.mainloop()
在新线程中启动mainloop。与在4.中一样,如果从线程访问GUI,Tkinter可能会崩溃。
import threading
thread = threading.Thread(target = master.mainloop)
thread.deamon = True # use this if your application does not close.
thread.start()
while X:
do_y()
在4和5中,GUI和while循环之间的通信可能/应该通过全局变量,但从不通过tkinter方法。
对于PyQT,请看这些问题: