Pyqt5 当选择widget.setFocus(True)时,QBasicTimer可用于以QThread启动的线程

Pyqt5 当选择widget.setFocus(True)时,QBasicTimer可用于以QThread启动的线程,pyqt5,qt5,Pyqt5,Qt5,我总是收到这个错误消息 当widget.setFocus()启动时,QBasicTimer可以与以QThread启动的线程一起使用 基本上,我有一个班是听GPIO的。 它将myForm.dial_on_value_changed()注册为对Rotary的回调,当旋转器旋转时,Rotary将调用dial_on_value_changed() 如果myForm.dial\u on\u value\u changed()只打印文本或字符串,则可以。但是,如果它选择myForm元素中的一个并更改其状态,

我总是收到这个错误消息

当widget.setFocus()启动时,QBasicTimer可以与以QThread启动的线程一起使用 基本上,我有一个班是听GPIO的。 它将myForm.dial_on_value_changed()注册为对Rotary的回调,当旋转器旋转时,Rotary将调用dial_on_value_changed()

如果myForm.dial\u on\u value\u changed()只打印文本或字符串,则可以。但是,如果它选择myForm元素中的一个并更改其状态,例如setFocus(True),它将抛出上面的错误,smth与QThread相关

我的应用程序是一个单线程,Rotari本身的工作原理是监听GPIO引脚中的中断,该引脚将调用注册的回调函数

有人能告诉我或指导我做错了什么吗?或者,解决这个问题的更好方法是“旋转旋钮,将所有GUI元素设置为焦点”

提前谢谢

这是我的代码片段

 class MyForm(QDialog):
   ### creating a circular list
   self._vt_dial_cycle = cycle([
        # tuple UI element with a function
        (self.vt_textedit, self.dial_to_vt),
        (self.rr_textedit, self.dial_to_rr),
        (self.stop_button, None),
        (self.start_button, None),
        (self.ie_textedit, self.dial_to_ie)
   ])


   def dial_to_vt(self):
       print("Dial on vt")

   def dial_to_rr(self):
       print("Dial on rr")
  
   def dial_to_ie(self):
       print("Dial on ie")

   def dial_on_value_changed(self, direction):
       # get next element from circular list.
       (active_widget, action) = next(self._vt_dial_cycle)
       self._current_widget = (active_widget, action)

       #execute action manually registered with widget
       action()

       if isinstance(active_widget, QTextEdit):
           self.move_cursor_to_end(active_widget)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyForm()
    w.show()

    # ... a rotari with a knop 
    ky040 = KY040(CLOCKPIN, DATAPIN, SWITCHPIN, w.dial_on_value_changed, w.dial_on_pressed)
    
    ky040.start()

您说您只使用了一个线程,但是从错误(顺便说一句,您没有正确报告:请在复制/粘贴错误消息时更加小心)和您的描述来看,
KY040
看起来很像有自己线程的东西,如果是这样,那么您已经有了答案:您无法从外部线程访问UI元素。假设我无法从外部线程访问UI元素,那么我如何处理来自GPIO的任何输入?我应该在特定的pin上进行某种共享吗?KY040是一个包装器,包装GPIO库,如果其中一个io引脚改变其状态,该库将注册回调。您能给我一个建议吗?使用带有自定义信号的QThread,并将信号
emit
用作触发GPIO时调用的函数参数,然后在QThread的
run()
中启动它。然后将线程的信号与实际与小部件交互的函数连接起来。对诸如QThread、worker和customsignals之类的术语做一些研究,因为关于这些主题的帖子有上百篇。非常感谢。我读过这本书Qt5 Python GUI编程。这有助于我理解。