Python-PyQt:QThread完成后继续

时间:2018-09-28 17:01:59

标签: python multithreading pyqt pyqt5 qthread

我在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_()

sese的输出是

0
1
2
3
4
cycle finished

print('thread finished')永远不会到达。

1 个答案:

答案 0 :(得分:1)

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)

如果要在完成线程执行后执行某些任务,则必须使用finished的{​​{1}}信号:

QThread