後臺耗時任務沒有處理好,會導致前端界面顯示卡頓,甚至卡死
運行後臺任務還有兩個問題
- 前端界面如何傳參數給後臺任務
- 後臺任務處理完後,如何傳參數給前端界面
前端界面如何傳參數給後臺任務
解決方法主要是再調用後臺任務的時候,通過構造函數__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_())