Я сейчас пытаюсь запрограммировать манипулятор робота, которым управляет Raspberry Pi.
Пока все работает нормально, кроме одной вещи, и я уже гуглил и пробовал все в течение многих часов, но не могу найти рабочее решение.
Для движения манипулятора робота необходимо запустить все двигатели «одновременно» с резьбой (работает нормально).
Проблема, с которой я столкнулся, заключается в том, что мне нужно обновите метку, которая показывает текущий угол оси (двигателя), как только она закончила свое движение, но другие двигатели все еще работают (резьбы).
После долгих исследований я подумал, что нашел решение, используя очередь и Tkinters после-метод. Но он все равно не работает, так как текст меток обновляется только после завершения всех потоков.
Я написал пример кода, в котором я хочу получить обновление метки для двигателя "one", которое завершит sh его for-l oop (100 итераций) перед двигателем "два" (500 итераций). Я ожидал, что метка будет обновлена, как только мотор один достигнет своей цели, в то время как мотор два все еще работает.
Но хотя я использовал метод after, он все еще ожидает завершения работы мотора два, прежде чем обновить метку.
Надеюсь, вы поможете мне!
from tkinter import *
import threading
import time
from queue import *
class StepperMotors:
def __init__(self, root):
self.root = root
self.start_btn = Button(root, text="Start", command=lambda:self.start_movement())
self.start_btn.config(width = 10)
self.start_btn.grid(row=1,column=1)
self.label_one = Label(root, text='')
self.label_one.config(width = 10)
self.label_one.grid(row=2, column=1)
self.label_two = Label(root, text='')
self.label_two.config(width = 10)
self.label_two.grid(row=3, column=1)
def start_movement(self):
self.thread_queue = Queue()
self.root.after(100, self.wait_for_finish)
thread_one = threading.Thread(target=self.motor_actuation, args=(1,100))
thread_two = threading.Thread(target=self.motor_actuation, args=(2,500))
thread_one.start()
thread_two.start()
thread_one.join()
thread_two.join()
def motor_actuation(self, motor, iterations):
for i in range(iterations):
i = i+1
update_text = str(motor) + " " + str(i) + "\n"
print(update_text)
time.sleep(0.01)
self.thread_queue.put(update_text)
def wait_for_finish(self):
try:
self.text = self.thread_queue.get()
self.label_one.config(text=self.text)
except self.thread_queue.empty():
self.root.after(100, self.wait_for_finish)
if __name__ == "__main__":
root = Tk()
root.title("test")
stepper = StepperMotors(root)
root.mainloop()