我遵循了有关使用PyQt在python中进行线程化的教程,但仍然受阻。任何人都可以澄清原因。可能是我没有意识到的事情。我有以下代码:
def blocker():
i = 0
while True:
i = i + 1
class CustomThread(QThread):
def __init__(self):
QThread.__init__(self)
def __del__(self):
self.wait()
def run(self):
self.emit(SIGNAL('update_log(QString)'), "Running Thread")
blocker()
class Form(QObject):
def __init__(self, ui_file, parent=None):
super(Form, self).__init__(parent)
ui_file = QFile(ui_file)
ui_file.open(QFile.ReadOnly)
loader = QUiLoader()
self.window = loader.load(ui_file)
ui_file.close()
generate_btn = self.window.findChild(QPushButton, 'generate_btn')
generate_btn.clicked.connect(self.generate_handler_clicked)
self.window.show()
def done(self):
log = self.window.findChild(QTextBrowser, 'log_browser')
log.setText("Done...\n" + log.toPlainText())
def update_log(self, update_text):
log = self.window.findChild(QTextBrowser, 'log_browser')
log.setText(update_text + "\n" + log.toPlainText())
def generate_handler_clicked(self):
log = self.window.findChild(QTextBrowser, 'log_browser')
log.setText("Button clicked\n" + log.toPlainText())
my_thread = CustomThread()
self.connect(my_thread, SIGNAL("update_log(QString)"), self.update_log)
self.connect(my_thread, SIGNAL("finished()"), self.done)
my_thread.start()
if __name__ == "__main__":
app = QApplication(sys.argv)
form = Form('uifile.ui')
sys.exit(app.exec_())
按下生成按钮时,应用程序挂起,而不是在单独的线程上运行。
更新:
我遇到了另一个教程,该教程在两行中做了一些不同的工作,似乎可以正常工作。我不确定这是否是最佳做法,以及为什么会奏效,对于其他可能会觉得有用的人来说,这是否会有所澄清。
我更改了以下内容:
# the following changes in this part of the CustomThread Class
class CustomThread(QThread):
def __init__(self): # ===> becomes def __init__(self, parent=None)
QThread.__init__(self) # ===> becomes QThread.__init__(self, parent)
...
# and where we call the thread in the following function changes to
def generate_handler_clicked(self):
...
my_thread = CustomThread() # ===> becomes my_thread = CustomThread(parent=self.window)
...
现在可以正常运行了,但没有完全挂起或出现问题,但还不完全了解为什么在窗口中固定修复了它们。
更新:
以下answer解释了正在发生的事情,但在发布此问题之前最初并未出现在建议中。