[英]PyQT4 and Threading: Closing MainWidget after QThread finished and ListWidget updated
[英]Python - PyQt : Continue after a QThread is finished
我在QThread中有一个for循环,该循环是通过按钮从主GUI启动的。 当for循环结束时,我想回到主线程(位于Gui类内部)并执行其他操作。 据我了解,应该使用join方法来等待线程完成。 就我而言,似乎MyThread从未完成。
import sys
from PyQt5 import QtCore
import PyQt5.QtWidgets as QtW
from PyQt5.QtCore import QThread
class MyWindow(QtW.QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('MyWindow')
self._main = QtW.QWidget()
self.setCentralWidget(self._main)
self.button = QtW.QPushButton('Do it', self)
self.button.clicked.connect(self.MyMethod)
self.layout = QtW.QGridLayout(self)
self.layout.addWidget(self.button)
self.setLayout(self.layout)
def MyMethod(self):
self.n = 5
self.loadthread = MyThread(self.n)
self.loadthread.start()
self.loadthread.join() # Will wait for the thread until it finishes its task
print('thread finished')
class MyThread(QThread):
def __init__(self, n):
QThread.__init__(self)
self.n = n
def run(self):
for i in range(self.n):
print(i)
print('cycle finished')
if __name__ == '__main__':
app = QtCore.QCoreApplication.instance() # checks if QApplication already exists
if app is None: # create QApplication if it doesnt exist
app = QtW.QApplication(sys.argv)
mainGui = MyWindow()
mainGui.show()
app.aboutToQuit.connect(app.deleteLater)
app.exec_()
cose的输出是
0
1
2
3
4
cycle finished
并且永远不会达到print('thread finished')
。
QThread
没有join()
方法,因此您的应用程序应意外退出并指向以下错误消息。
QLayout: Attempting to add QLayout "" to MyWindow "", which already has a layout
QWidget::setLayout: Attempting to set QLayout "" on MyWindow "", which already has a layout
0
1
2
3
Traceback (most recent call last):
File "main.py", line 24, in MyMethod
self.loadthread.join() # Will wait for the thread until it finishes its task
AttributeError: 'MyThread' object has no attribute 'join'
4
cycle finished
Aborted (core dumped)
如果要在完成线程执行后执行某些任务,则必须使用QThread
的finished
信号:
import sys
from PyQt5 import QtCore, QtWidgets
class MyWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('MyWindow')
self._main = QtWidgets.QWidget()
self.setCentralWidget(self._main)
self.button = QtWidgets.QPushButton('Do it')
self.button.clicked.connect(self.my_method)
layout = QtWidgets.QGridLayout(self._main)
layout.addWidget(self.button)
layout.addWidget(self.button)
@QtCore.pyqtSlot()
def my_method(self):
self.n = 5
self.loadthread = MyThread(self.n, self)
self.loadthread.finished.connect(self.on_finished)
self.loadthread.start()
@QtCore.pyqtSlot()
def on_finished(self):
print('thread finished')
class MyThread(QtCore.QThread):
def __init__(self, n, parent=None):
QtCore.QThread.__init__(self, parent)
self.n = n
def run(self):
for i in range(self.n):
print(i)
print('cycle finished')
if __name__ == '__main__':
app = QtWidgets.QApplication.instance()
if app is None:
app = QtWidgets.QApplication(sys.argv)
mainGui = MyWindow()
mainGui.show()
app.aboutToQuit.connect(app.deleteLater)
sys.exit(app.exec_())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.