Цикл tkinter и последовательная запись

я написал gui, используя tkinter, и мне нужно отправить значения 2 шкалы в реальном времени в arduino. я подтвердил, что arduino работает с использованием другого эскиза, который отправляет значения в arduino, и они получены, я добавил в следующий код код моей питона

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 в режиме реального времени по серийному номеру.

heres код:

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

One Solution collect form web for “Цикл tkinter и последовательная запись”

контекст

Вы используете mainloop Tkinter и некоторое while -loop, и теперь вы хотите поместить оба вместе в одну программу.

 while X: do_y() 

а также

 master.mainloop() 

Решения

Для вас есть несколько решений.

  1. разделить цикл и использовать его, чтобы позволить графическому интерфейсу перезвонить:

     def do_y2(): do_y() if X: master.after(123, do_y2) # after 123 milli seconds this is called again do_y2() master.mainloop() 

    Более подробный ответ см. В этом ответе Брайана Окли

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

    Этот подход является необычным, поскольку он заменяет mainloop, который является частью большинства графических интерфейсов, таких как Tkinter. Обратите внимание, что с 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. запустите mainloop в новом потоке. Как и в 4. 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-loop может / должна проходить через глобальные переменные, но никогда не с помощью методов tkinter.


Для PyQT см. Следующие вопросы:

  • Как выйти из программы во время цикла с помощью кнопки в PyQt
  • Как установить кнопочное прерывание клавиатуры в PyQt
  • Запустить процесс с выходом в реальном времени в графический интерфейс Tkinter
  • Получить входные данные из флажка в python tkinter?
  • Как сделать мигающее текстовое поле в tkinter?
  • TkInter, слайдер: как вызвать событие только после завершения итерации?
  • Python, Tkinter - Вставка текста в окна холста
  • измерять прогресс (время осталось), в то время как os.listdir генерирует список (Python)
  • Что является лучшим менеджером геометрии Tkinter, чем .grid ()
  • Как сделать кнопку с помощью виджета tkinter Canvas?
  • Python - лучший язык программирования в мире.