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)   #延时2print('延时2s结束,现在时间:', datetime.datetime.now())
    def fun_delay10s(self):
        print('我按下了延时10秒按钮,开始时间:',datetime.datetime.now())
        time.sleep(10)  #延时10print('延时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 最终效果

  • 两个任务可以同时运行,前后台分离
    在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值