PyQt后台耗时任务运行

后台耗时任务没有处理好,会导致前端界面显示卡顿,甚至卡死

运行后台任务还有两个问题

  • 前端界面如何传参数给后台任务
  • 后台任务处理完后,如何传参数给前端界面

前端界面如何传参数给后台任务

解决方法主要是再调用后台任务的时候,通过构造函数__init__()传递

def __init__(self, parent= None, model_path="", emationText = ""):

后台任务处理完后,如何传参数给前端界面

这个主要是通过信号传参,任务处理完后,发射一个信号,通过信号传递参数,当然信号在前端界面要跟相应的槽函数绑定。
需要注意的问题是,耗时多久的任务才放进后台处理?我认为为了更好的体验,前端界面不卡顿,超过1s的任务都放进后台处理。

后台任务处理该怎么写?

class EmationThread(QtCore.QThread):  # 继承QThread
    resSignal = QtCore.pyqtSignal(str)  # 注册一个信号
    def __init__(self, parent= None, model_path="", emationText = ""): # 从前端界面中传递参数到这个任务后台
        super(EmationThread, self).__init__(parent)
        self.model_path = model_path
        self.emationText = emationText
        
    def run(self):  # 重写run  比较耗时的后台任务可以在这里运行
        print(self.model_path)
        
        time.sleep(3)
        print(self.emationText)
        self.Resematin = "Prostive"
        self.resSignal.emit(self.Resematin)  # 任务完成后,发送信号

前端界面


class MyForm(object):
    def setupUi(self, mainWindow):
        mainWindow.setObjectName("mainWindow")
        mainWindow.resize(492, 386)
        self.centralwidget = QtWidgets.QWidget(mainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(40, 120, 341, 80))
        self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_2 = QtWidgets.QLabel(self.horizontalLayoutWidget_2)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_2.addWidget(self.label_2)
        self.emationText = QtWidgets.QTextEdit(self.horizontalLayoutWidget_2)
        self.emationText.setObjectName("emationText")
        self.horizontalLayout_2.addWidget(self.emationText)
        self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(40, 37, 341, 81))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.Model_But = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.Model_But.setObjectName("Model_But")
        self.horizontalLayout.addWidget(self.Model_But)
        self.Model_path = QtWidgets.QLineEdit(self.horizontalLayoutWidget)
        self.Model_path.setObjectName("Model_path")
        self.horizontalLayout.addWidget(self.Model_path)
        self.horizontalLayoutWidget_3 = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_3.setGeometry(QtCore.QRect(100, 210, 201, 80))
        self.horizontalLayoutWidget_3.setObjectName("horizontalLayoutWidget_3")
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_3)
        self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.emationRes = QtWidgets.QLabel(self.horizontalLayoutWidget_3)
        self.emationRes.setObjectName("emationRes")
        self.horizontalLayout_3.addWidget(self.emationRes)
        self.submitBut = QtWidgets.QPushButton(self.horizontalLayoutWidget_3)
        self.submitBut.setObjectName("submitBut")
        self.horizontalLayout_3.addWidget(self.submitBut)
        mainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(mainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 492, 23))
        self.menubar.setObjectName("menubar")
        mainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(mainWindow)
        self.statusbar.setObjectName("statusbar")
        mainWindow.setStatusBar(self.statusbar)
        self.widgetUnit()
        self.retranslateUi(mainWindow)
        QtCore.QMetaObject.connectSlotsByName(mainWindow)

    def widgetUnit(self):
        self.Model_But.clicked.connect(self.ModelButSolt)
        self.submitBut.clicked.connect(self.SubmitButSlot)
    
    def ModelButSolt(self):
        self.fileName, tpye= QtWidgets.QFileDialog.getOpenFileName(caption="选择文件夹", directory="./", filter="All Files (*);;Text Files (*.txt)")
        self.Model_path.setText(self.fileName)
    def SubmitButSlot(self):
        emationText = self.emationText.toPlainText()
        modelPath = self.Model_path.text()
        self.ThreadEmation = EmationThread(model_path= modelPath, emationText = emationText)
        self.ThreadEmation.resSignal.connect(self.ResSlot)  # 把任务完成的信号与任务完成后处理的槽函数绑定
        self.ThreadEmation.start()
        
    def ResSlot(self, res):
        self.emationRes.setText(res)


    def retranslateUi(self, mainWindow):
        _translate = QtCore.QCoreApplication.translate
        mainWindow.setWindowTitle(_translate("mainWindow", "情感分析"))
        self.label_2.setText(_translate("mainWindow", "情感分析文本:"))
        self.Model_But.setText(_translate("mainWindow", "选择Model:"))
        self.emationRes.setText(_translate("mainWindow", "情感分析结果"))
        self.submitBut.setText(_translate("mainWindow", "分析"))

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    widget = QtWidgets.QMainWindow()
    ui = MyForm()
    ui.setupUi(widget)
    widget.show()
    sys.exit(app.exec_())

例子效果

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章