20221214星期三:
背景:
在主類MyClass中,按鈕pushButton綁定的函數,這個函數就進行頁面的資料判斷即可;涉及到處理邏輯問題,就重開一個函數 loadDaiBanThread ,并将這個函數丢到另一個線程中去執行;這樣就避免了,點選按鈕的時候,頁面卡死的情況;
步驟:
1,建立多線程:執行多線程的函數:mv.loadDaiBanThread()
2,執行個體化多線程:并綁定到多線程執行完以後,需要執行的函數(self.get_sin_out)
3,按鈕綁定到啟動線程:
4,啟動多線程:
5,多線程執行完以後,進行恢複操作:
1,建立多線程:執行多線程的函數:mv.loadDaiBanThread()
2,執行個體化多線程:并綁定到多線程執行完以後,需要執行的函數(self.get_sin_out)
3,按鈕綁定到啟動線程:
4,啟動多線程:
5,多線程執行完以後,進行恢複操作:
6,成品展示:
另一套參考代碼如下:
import json,os,sys,time
from PyQt5.QtWidgets import * # 子產品包含創造經典桌面風格的使用者界面提供了一套UI元素的類
from PyDevelop.PO3_1122.Function_Gui.Fighting2022Gui.Fighting11.MainWindowZhiHui import Ui_MainWindow
from PyDevelop.PO3_1122.Function_Gui.Fighting2022Gui.Fighting11.createExcel import myExcel
from PyQt5.QtCore import Qt,QThread,pyqtSignal
class mywindow(QMainWindow,Ui_MainWindow):
def __init__(self, *args, **kwargs):
# 2,執行個體化多線程:并綁定到多線程執行完以後,需要執行的函數(self.get_sin_out)
self.my_thread = myThread()
# 執行個體化對象綁定函數 get_sin_out,當多線程執行完成以後,執行 get_sin_out 函數中的代碼,即按鈕的還原操作:
self.my_thread.my_str.connect(self.get_sin_out)
# 按鈕綁定到啟動線程:
self.pushButton.clicked.connect(lambda: self.start_thread())
'''
構造函數,初始化參數屬性
:param args:
:param kwargs:
'''
# super().__init__(*args, **kwargs)
super(mywindow, self).__init__()
self.setupUi(self)
# 不允許GUI界面拉伸:
self.setFixedSize(self.width(), self.height()) # 禁止拉伸視窗大小
self.pushButton.setStyleSheet(
'''QPushButton{background:#F1ABAD;border-radius:16px;}''')
def slot1(self):
print("slot1")
self.pushButton.setText('程式執行中...')
self.pushButton.setDisabled(True)
self.pushButton.setStyleSheet('''QPushButton{background:#DFADBB;}''')
self.lineEdit.setDisabled(True)
print("開始執行exa02")
# 4,啟動多線程:
def start_thread(self):
"""
啟動多線程
:return:
"""
try:
print("此處省略一萬行代碼。")
self.my_thread.start()
except Exception as e:
print(e)
# 5,多線程執行完以後,進行恢複操作:
def get_sin_out(self,out_str):
if out_str == "ok":
print("處理完成")
# 當多線程執行完成以後,進行按鈕恢複;
self.pushButton.setText('執行')
self.pushButton.setDisabled(False)
self.pushButton.setStyleSheet('''QPushButton{background:#F1ABAD;border-radius:5px;}''')
self.lineEdit.setDisabled(False)
# 1,建立多線程:繼承 QThread
class myThread(QThread):
my_str = pyqtSignal(str) # 建立任務信号
def run(self):
myExcel().createEXCEL()
self.my_str.emit("ok") # 發出任務完成信号
if __name__ == '__main__':
app = QApplication(sys.argv)
main = mywindow()
main.show()
sys.exit(app.exec_())