十二、PyQt5 之 多线程

一、定时器(QTimer)

#!/usr/bin/python
# -*- coding:utf-8 -*-


"""
动态显示时间

QTimer


多线程:用于同时完成多个任务
"""

from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QListWidget, QGridLayout, QLabel
from PyQt5.QtCore import QTimer, QDateTime
import sys


class ShowTime(QWidget):

    def __init__(self, parent=None):
        super(ShowTime, self).__init__(parent)
        self.setWindowTitle("动态显示当前时间")

        self.label = QLabel("显示当前时间")
        self.startBtn = QPushButton("开始")
        self.enBtn = QPushButton("结束")
        layout = QGridLayout()

        self.timer = QTimer()
        self.timer.timeout.connect(self.showTime)

        layout.addWidget(self.label, 0, 0, 1, 2)
        layout.addWidget(self.startBtn, 1, 0)
        layout.addWidget(self.enBtn, 1, 1)

        self.startBtn.clicked.connect(self.startTime)
        self.enBtn.clicked.connect(self.endTime)

        self.setLayout(layout)

    def showTime(self):
        time = QDateTime.currentDateTime()
        timeDisplay = time.toString("yyyy-MM-dd hh:mm:ss dddd")
        self.label.setText(timeDisplay)

    def startTime(self):
        # 指定时间间隔 1000ms 也就是 1s
        self.timer.start(1000)
        # 设置按钮状态
        self.startBtn.setEnabled(False)
        self.enBtn.setEnabled(True)

    def endTime(self):
        self.timer.stop()
        self.startBtn.setEnabled(True)
        self.enBtn.setEnabled(False)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = ShowTime()
    form.show()
    sys.exit(app.exec_())

二、让窗口定时关闭(singleShot)

#!/usr/bin/python
# -*- coding:utf-8 -*-

"""
让程序定时关闭

QTimer.singleShot   值执行一次

上一个定时器 QTimer.start() 操作是每间隔一段时间就会一直调用
"""

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

if __name__ == '__main__':
    app = QApplication(sys.argv)
    label = QLabel("<font color=red size=140><b>Hello World,窗口在5秒后自动关闭!</b></font>")
    # 让标签的状态栏,标题栏等隐藏
    label.setWindowFlags(Qt.SplashScreen | Qt.FramelessWindowHint)
    label.show()
    # 设置 5s 关闭, singleShot 代表只执行一次
    QTimer.singleShot(5000, app.quit)
    sys.exit(app.exec_())

三、使用线程类编写计数器(QThread)

#!/usr/bin/python
# -*- coding:utf-8 -*-

"""
使用线程类(QThread)编写计数器

基本原理如下:
def run():
    while True:
        self.time(1)
        if sec == 5:
            break

 QLCDNumber : 模拟 LCD 显示的控件

 WorkThread(QThread): 用到自定义信号
"""

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

sec = 0


class WorkThread(QThread):
    # 每隔 1秒 发送一次信号
    timer = pyqtSignal()
    # 计数完成后发送一次信号
    end = pyqtSignal()

    def run(self):
        while True:
            self.sleep(1)
            if sec == 5:
                # 发送end信号
                self.end.emit()
                break
            # 发送 timer 信号
            self.timer.emit()


class Counter(QWidget):
    def __init__(self):
        super(Counter, self).__init__()
        self.setWindowTitle("使用线程类(QThread)编写计数器")
        self.resize(300, 120)

        layout = QVBoxLayout()
        # 创建一个 LCD 显示控件
        self.lcdNumber = QLCDNumber()
        layout.addWidget(self.lcdNumber)

        button = QPushButton('开始计数')
        layout.addWidget(button)

        # 创建一个线程
        self.workThread = WorkThread()
        # 绑定开始事件
        self.workThread.timer.connect(self.countTime)
        # 绑定结束事件
        self.workThread.end.connect(self.end)

        button.clicked.connect(self.work)
        self.setLayout(layout)

    def countTime(self):
        global sec
        sec += 1
        self.lcdNumber.display(sec)

    def end(self):
        QMessageBox.information(self, "消息", "计数结束", QMessageBox.OK)

    def work(self):
        self.workThread.start()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Counter()
    form.show()
    sys.exit(app.exec_())

 

posted on 2022-07-09 11:29  软饭攻城狮  阅读(890)  评论(0)    收藏  举报

导航