1. 多線程計算器
'''
start():啟動線程
wait():阻止線程,直到滿足如下條件之一
(1)與此QThread對象關聯的線程已完成執行(即從run返回時),如果線程完成執行,此函數返回True,如果線程尚未啟動,也返回True
(2)等待時間的單位是毫秒,如果時間是ULONG_MAX(默認值·),則等待,永遠不會超時(線程必須從run返回),如果等待超時,此函數將會返回False
sleep():強制當前線程睡眠多少秒
QThread類中的常用信號
started:在開始執行run函數之前,從相關線程發射此信號
finished:當程序完成業務邏輯時,從相關線程發射此信號
'''
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
sec = 0
class WorkThread(QThread): # 創建多個任務可以建多個 WorkThread(QThread) 后面啟動
timer = pyqtSignal(str) # 每隔1秒發送一次信號 str:可以傳遞參數
end = pyqtSignal(str) # 計數完成后發送一次信號
def run(self):
while True:
self.sleep(1) # 休眠1秒
if sec == 5:
self.end.emit(str(sec)) # 發送end信號 str:可以傳遞參數
break
self.timer.emit(str(sec)) # 發送timer信號 str:可以傳遞參數
class Counter(QWidget):
def __init__(self, parent=None):
super(Counter, self).__init__(parent)
self.setWindowTitle("使用線程類(QThread)編寫計數器")
self.resize(300, 120)
layout = QVBoxLayout()
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, secs):
global sec
sec += 1
print(secs)
self.lcdNumber.display(sec)
def end(self, secs):
print(secs)
QMessageBox.information(self, '消息', '計數結束', QMessageBox.Ok)
def work(self):
self.workThread.start() # 多個任務可以創建多self.workThread.start()
if __name__ == "__main__":
app = QApplication(sys.argv)
form = Counter()
form.show()
sys.exit(app.exec_())
2. 定時任務
'''
動態顯示當前時間
QTimer # 定時器
QThread # 多線程
多線程:用於同時完成多個任務
'''
import sys
from PyQt5.QtCore import QTimer, QDateTime
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QGridLayout, QLabel
class ShowTime(QWidget):
def __init__(self, parent=None):
super(ShowTime, self).__init__(parent)
self.setWindowTitle("動態顯示當前時間")
self.label = QLabel('顯示當前時間')
self.startBtn = QPushButton('開始')
self.endBtn = 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.endBtn, 1, 1)
self.startBtn.clicked.connect(self.startTimer)
self.endBtn.clicked.connect(self.endTimer)
self.setLayout(layout)
def showTime(self):
time = QDateTime.currentDateTime()
timeDisplay = time.toString("yyyy-MM-dd hh:mm:ss dddd")
self.label.setText(timeDisplay)
def startTimer(self):
self.timer.start(1000)
self.startBtn.setEnabled(False)
self.endBtn.setEnabled(True)
def endTimer(self):
self.timer.stop()
self.startBtn.setEnabled(True)
self.endBtn.setEnabled(False)
if __name__ == "__main__":
app = QApplication(sys.argv)
form = ShowTime()
form.show()
sys.exit(app.exec_())