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

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