【发布时间】:2022-10-04 19:21:27
【问题描述】:
本质上,我有一个程序,它将在单击按钮时开始。一旦我启动该过程,一切正常,直到需要用户输入。但是,当用户单击按钮时,不会发出“单击”信号。信号适当地连接到插槽。将代码移至 QThread 后,按钮单击停止工作。
class Procedure(QObject):
def __init__(self, parent):
super().__init__()
self.parent = parent
self.parent.button_a.clicked.connect(self.on_button_a_clicked)
self.event = threading.Event()
def run(self):
# started running, doing some stuff here
# waits for button click, i.e. when button is clicked, the event is set and then you may proceed
self.event.wait()
# NEVER REACHES HERE
def on_button_a_clicked(self):
self.event.set()
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
self.setFixedSize(self.size())
self.start_button.clicked.connect(self.on_start_clicked)
def on_start_clicked(self):
self.thread = QThread()
self.worker = Procedure(self)
self.worker.moveToThread(self.thread)
self.thread.started.connect(self.worker.run)
self.thread.start()
def main():
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
if __name__ == '__main__':
main()
但是,我确实有迹象表明,信号已正确连接到插槽,就像在功能中一样跑()我手动发出信号,成功模拟了按钮单击。因此,我认为问题在于按钮单击未正确注册。
def run(self):
# started running, doing some stuff here
# following line successfully emulates the button click
self.parent.button_a.clicked.emit()
self.event.wait()
# reaches here successfully
我还认为这与 QThread 有关,因为问题出现在我开始在 QThread 中运行我的程序之后,但我在这里迷失了方向,我不知道如何调试这个问题。 先感谢您。
【问题讨论】:
-
on_button_a_clicked将被调用在它自己的线程,但由于该线程被event.wait()阻塞,它不能被调用。尝试更改为self.parent.button_a.clicked.connect(self.event.set)。但请注意,访问不相关的父级的子级属性并不是一个好习惯。 -
你的例子不起作用,因为我在这里给出的代码是最小化的例子,实际上,除了这个函数之外,还有更多的事情发生self.event.set(),但至少现在我知道了问题所在,所以我也许能够弄清楚一些事情。
标签: python pyqt signals-slots qthread