Python Tkinter: ссылка на значение ползунка в нескольких потоках приводит к ошибке - PullRequest
1 голос
/ 13 июля 2020

Я создал собственный класс виджетов tkinter, который имеет (среди прочего) слайдер. Приведенные ниже методы run_control_thread и control_l oop являются методами внутри указанного класса. Они запускают поток, который отправляет команду двигателю, когда нажимается кнопка (также «дочерний элемент» моего класса виджетов). Это отлично работает, когда только один виджет управляет двигателем, но если есть несколько виджетов, управляющих (разными) двигателями, при попытке запустить self.slider.get () выскакивает ошибка, наблюдаемая в методе run_control_thread. Вместо получения значения ползунка возникает исключение. Я новичок в Python, Tkinter и Stack Overflow, поэтому я буду благодарен за любую помощь!

    def run_control_thread(self):
        global HTTP, command
        print("running")
        def run_thread():
            global HTTP, command
            current_device = CANDeviceDict[self.current_chosen]
            while(self.control_loop_enabled == True):
                demand = self.slider.get()
                HTTP.send_command(command.control(current_device.model, current_device.id, demand, False, False, 
                                  self.control_mode_value(), 0, 0, False, False))
                time.sleep(0.028)
        control_thread = threading.Thread(target=run_thread)
        control_thread.start()

    def control_loop(self):
        global HTTP, selected_device, command
        if HTTP != None and command != None and selected_device != None:
            if (self.control_loop_enabled):
                self.control_loop_enabled = False
                self.enable_control.config(text="Enable Control")
                self.slider.set(0)
            else:
                self.control_loop_enabled = True
                self.enable_control.config(text="Disable Control")
            self.run_control_thread()

Ошибки:

>Exception in thread Thread-4"
Traceback (most recent call last):
    File "C:\...\Python\Python38-32\lib\tkinter\__init__.py", line 3457, in get
    return self.tk.getint(value)
    _tkinter.TclError: expected integer but got "expected integer but got "0.00""
    <class 'tkinter.Scale'>

>During handling of the above exception, another exception occurred:
Traceback (most recent call last):
    File "C:\...\Python\Python38-32\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
    File "C:\...\Python\Python38-32\lib\threading.py", line 870, in run
    demand = self.slider.get()
    File "C:\...\Python\Python38-32\lib\tkinter\__init__.py", line 3460, in get
    return self.tk.getdouble(value)
    <class 'tkinter.Scale'>
    _tkinter.TclError: expected floating-point number but got "expected integer but got "0.00""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...