Python 3.x 为PyQT GUI线程化方法
我有一个pyqt GUI和一个方法[BigramClassification()],它会导致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
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)
,然后重试。