线程化PyQT GUI的方法

时间:2017-10-18 16:44:41

标签: multithreading pyqt4 python-3.6 qthread

我有一个pyqt GUI和一个方法[BigramClassification()],它会导致GUI挂起几秒钟。因此,我发现需要使用线程。所以在阅读了几个教程后,我想出了以下代码。

import sys,os

from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import QThread
import time

class MyForm(QtGui.QMainWindow):

    def __init__(self, parent=None):

        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.lblHistory.setPixmap(QtGui.QPixmap(os.getcwd() + "/historygraph.png"))

        self.workerThread=WorkingThread()
        self.ui.pushButton.clicked.connect(self.generateDetails)
        self.ui.btnsubmitsettings.clicked.connect(self.addDetails)



    def generateDetails(self):
        self.workerThread.start()
        self.ui.lblHistory.setPixmap(QtGui.QPixmap(os.getcwd() + "/historygraph.png"))
        self.addPiechart()
        self.addWordCloud()
        self.summaryText()


    def addPiechart(self):

        print ("Added")

    def addWordCloud(self):

        print ("Added")

    def addDetails(self):


    def summaryText(self):

        print("Added")

class WorkingThread(QThread):
    def __init__(self, parent=None):
        super(self.__class__, self).__init__(parent)

    def run(self):
        BigramsClassifier()

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)

    myapp = MyForm()
    myapp.show()
    sys.exit(app.exec_())

我遇到的问题是当我运行这个并点击pushButton线程启动但是也执行start()之后的方法,如def generateDetails(self):所示我需要准备这个代码所以def generateDetails(self):中的方法在执行重度方法BigramClassification()执行线程后执行。

摘要如何在def generateDetails(self):中停止自动执行方法,但只有在方法BigramClassification()完成后才会停止。

编辑当我尝试关闭GUI时,会抛出此错误。

enter image description here

1 个答案:

答案 0 :(得分:2)

将一个插槽连接到线程的finished信号,该信号可以在长时间运行的任务完成后执行其他操作:

class MyForm(QtGui.QMainWindow):    
    def __init__(self, parent=None):
        ...
        self.workerThread = WorkingThread()
        self.workerThread.finished.connect(self.doOtherStuff)
        ...

    def generateDetails(self):
        if not self.workerThread.isRunning():
            self.workerThread.start()

    def doOtherStuff(self):
        self.ui.lblHistory.setPixmap(QtGui.QPixmap(os.getcwd() + "/historygraph.png"))
        self.addPiechart()
        self.addWordCloud()
        self.summaryText()
相关问题