PyQt5使用QThread實現前後臺分離

1.新建一個界面,添加兩個按鈕

在這裏插入圖片描述

2.先單線程實現延時

2.1 main.py內容如下:

from PyQt5.QtWidgets import QApplication,QMainWindow
from mainwindow import Ui_MainWindow
import sys,time,datetime

class My_UI(QMainWindow, Ui_MainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)
        self.connectSignalSlot()

    def connectSignalSlot(self):
        self.Btn_delay2s.clicked.connect(self.fun_delay2s)
        self.Btn_delay10s.clicked.connect(self.fun_delay10s)

    def fun_delay2s(self):
        print('我按下了延時2秒按鈕,開始時間:',datetime.datetime.now())
        time.sleep(2)   #延時2秒
        print('延時2s結束,現在時間:', datetime.datetime.now())

    def fun_delay10s(self):
        print('我按下了延時10秒按鈕,開始時間:',datetime.datetime.now())
        time.sleep(10)  #延時10秒
        print('延時10s結束,現在時間:', datetime.datetime.now())


class CommonHelper:
    def __init__(self):
        pass

    @staticmethod
    def readQss(style):
        with open(style, 'r') as f:
            return f.read()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    # 設置style
    styleFile = './css.qss'
    qssStyle = CommonHelper.readQss(styleFile)
    app.setStyleSheet(qssStyle)
    # 顯示窗口
    win = My_UI()
    win.show()
    sys.exit(app.exec_())

2.2 按下按鈕,界面會卡死,兩個延時不能同時進行
在這裏插入圖片描述

2.建立耗時任務線程類

2.1 新建 Class_delay.py

from PyQt5.QtCore import QThread, pyqtSignal
import time

class Delay_ns(QThread):
    # 使用信號和UI主線程通訊
    signal_over = pyqtSignal(str)

    def __init__(self, time=1, parent=None):
        super(Delay_ns, self).__init__(parent)

        self.delay_time = time  #設置延時時間

    def run(self):
        print('正在進行延時{0}秒'.format(self.delay_time))
        time.sleep(self.delay_time)
        self.signal_over.emit('結束信號:延時{0}結束'.format(self.delay_time))
        return

2.2 修改 main.py

from PyQt5.QtWidgets import QApplication,QMainWindow
from mainwindow import Ui_MainWindow
import sys,time,datetime
from Class_delay import Delay_ns

class My_UI(QMainWindow, Ui_MainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)
        self.connectSignalSlot()

    def connectSignalSlot(self):
        self.Btn_delay2s.clicked.connect(self.fun_delay2s)
        self.Btn_delay10s.clicked.connect(self.fun_delay10s)

    def fun_delay2s(self):
        print('我按下了延時2秒按鈕,開始時間:',datetime.datetime.now())
        self.delay2s = Delay_ns(2)
        self.delay2s.signal_over.connect(self.thread_delay2s_over)
        print('延時2s線程開始,函數退出,時間:', datetime.datetime.now())
        self.delay2s.start() # 啓動線程


    def fun_delay10s(self):
        print('我按下了延時10秒按鈕,開始時間:',datetime.datetime.now())
        self.delay10s = Delay_ns(10)
        self.delay10s.signal_over.connect(self.thread_delay10s_over)
        print('延時10s線程開始,函數退出,時間:', datetime.datetime.now())
        self.delay10s.start() # 啓動線程

    def thread_delay2s_over(self,str):
        print(str)
        del self.delay2s

    def thread_delay10s_over(self,str):
        print(str)
        del self.delay10s



class CommonHelper:
    def __init__(self):
        pass

    @staticmethod
    def readQss(style):
        with open(style, 'r') as f:
            return f.read()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    # 設置style
    styleFile = './css.qss'
    qssStyle = CommonHelper.readQss(styleFile)
    app.setStyleSheet(qssStyle)
    # 顯示窗口
    win = My_UI()
    win.show()
    sys.exit(app.exec_())

2.3 最終效果

  • 兩個任務可以同時運行,前後臺分離
    在這裏插入圖片描述

源碼下載:https://download.csdn.net/download/u014779536/12265078

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