Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 为PyQT GUI线程化方法_Python 3.x_Multithreading_Pyqt4_Qthread - Fatal编程技术网

Python 3.x 为PyQT GUI线程化方法

Python 3.x 为PyQT GUI线程化方法,python-3.x,multithreading,pyqt4,qthread,Python 3.x,Multithreading,Pyqt4,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=No

我有一个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_())
我遇到的问题是,当我运行此命令并单击
按钮时,线程将启动,但也会在
start()
之后执行方法,如
def generatedeails(self)中所示:
我需要准备此代码,以便
def generatedeails(self)中的方法:
在线程完成后执行,使用heavy方法执行
BigramClassification()
执行

Summary如何停止
def generateDetails(self):
中方法的自动执行,但必须在方法
bigramsclassification()
完成后才能停止

编辑当我试图关闭GUI时,会引发此错误


将插槽连接到线程的
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()

你的解决方案非常有效,在过去的两天里一直被困在这个问题中。总之,一旦我关闭GUI,就会抛出一个运行时错误,说“主线程不在主循环中”,我使用的是QT设计器而不是Tkinter。如果没有任何线程部分,GUI不会在关闭时抛出此类错误,只会挂起几次seconds@rando. 你是在空转还是什么?这个错误显然与PyQt无关。尝试使用
python.exe
在命令窗口中运行脚本。理想情况下,您的程序应该在线程关闭之前等待线程完成(或以某种方式终止它)。不,我正在使用PyCharm运行它。我在使用队列中发现的方法可以解决此问题。你能告诉我如何使用线程队列吗?@rando。PyQt真的不可能引发这个错误。你一定在某个地方运行了一些tkinter代码——从你问题中的代码中我能看到的唯一地方就是
BigramsClassifier
函数。注释该行并输入时间。睡眠(2)
,然后重试。