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

例子效果

在這裏插入圖片描述

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