天天看點

PyQt5桌面應用程式之使用多線程規避程式卡死

20221214星期三:

背景:

在主類MyClass中,按鈕pushButton綁定的函數,這個函數就進行頁面的資料判斷即可;涉及到處理邏輯問題,就重開一個函數 loadDaiBanThread ,并将這個函數丢到另一個線程中去執行;這樣就避免了,點選按鈕的時候,頁面卡死的情況;

步驟:

1,建立多線程:執行多線程的函數:mv.loadDaiBanThread()

2,執行個體化多線程:并綁定到多線程執行完以後,需要執行的函數(self.get_sin_out)

3,按鈕綁定到啟動線程:

4,啟動多線程:

5,多線程執行完以後,進行恢複操作:

1,建立多線程:執行多線程的函數:mv.loadDaiBanThread()

PyQt5桌面應用程式之使用多線程規避程式卡死

2,執行個體化多線程:并綁定到多線程執行完以後,需要執行的函數(self.get_sin_out)

PyQt5桌面應用程式之使用多線程規避程式卡死

3,按鈕綁定到啟動線程:

PyQt5桌面應用程式之使用多線程規避程式卡死

4,啟動多線程:

PyQt5桌面應用程式之使用多線程規避程式卡死

5,多線程執行完以後,進行恢複操作:

PyQt5桌面應用程式之使用多線程規避程式卡死

6,成品展示:

PyQt5桌面應用程式之使用多線程規避程式卡死

另一套參考代碼如下:

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

           

繼續閱讀