tkinter循环和串行写入

我已经写了一个使用tkinter的gui,我需要将两个尺度的值实时地发送给一个arduino。 我已经validation了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不加载到数据只有发送一次guiclosures。 有人可以告诉我如何让gui运行,当我移动一个规模的价值是实时发送到arduino串行。

inheritance人的代码:

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

上下文

你使用Tkinter mainloop和一个while -loop,现在你想把两者合并成一个程序。

 while X: do_y() 

 master.mainloop() 

解决scheme

有几个解决scheme给你。

  1. 拆分循环并使用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() 

    有关更详细的答案,请参阅Bryan Oakley的 答案

  2. 用我的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循环。

  3. 使用update来刷新GUI。

     while X: do_y() master.update() 

    这种方法是一个不寻常的方法,因为它取代了像Tkinter这样的大多数GUI框架的一部分。 请注意,对于1和2,可以有多个循环,而不是3中的一个。

  4. 使用并行执行循环的新执行线程。 ! 这个线程不能直接访问主或任何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() 
  5. 在新线程中启动主循环。 和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循环可以/应该通过全局variables,但从来没有通过tkinter方法。


对于PyQT,请看这些问题:

  • 如何使用PyQt中的button在while循环中退出程序
  • 如何在PyQt中设置按键到键盘中断