十二、PyQt5 之 多线程
#!/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_())
#!/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_())
#!/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_())



浙公网安备 33010602011771号