rando
rando

Reputation: 67

Threading a method for a PyQT GUI

I have a pyqt GUI and a method[BigramClassification()]which causes the GUI to hang for several seconds. Therefore, i figured out threading need to be used. So after reading several tutorials i came up with the following code.

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

The problem i have is when i run this and click on pushButton the thread starts but also executes the methods after the start() as seen in def generateDetails(self): I need to prepare this code so that the methods in def generateDetails(self): executes after the thread is done executing with the heavy method BigramClassification()execution.

Summary How can i stop the auto execution of the methods in def generateDetails(self): but only after the method BigramClassification() is completed.

EDIT This error is thrown up when i try to close the GUI.

enter image description here

Upvotes: 2

Views: 574

Answers (1)

ekhumoro
ekhumoro

Reputation: 120578

Connect a slot to the thread's finished signal which can performs other actions once the long-running task is completed:

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()

Upvotes: 3

Related Questions