PyQt5進階(二)——多執行緒:QTimer
阿新 • • 發佈:2018-12-13
應用程式開發中多執行緒的必要性:
一般情況下,應用程式都是單執行緒執行的,但是對GUI程式來說,單執行緒有時候滿足不了要求,但是對於一些特殊情況:比如一個耗時較長的操作,執行過程會有卡頓讓使用者以為程式出錯而把程式關閉或是系統本身認為程式執行出錯而自動關閉程式。這個時候就需要用到多執行緒的知識。一般來說,多執行緒技術主要涉及以下三種方法:
1.利用計時器模組QTimer
2.使用多執行緒模組QThread
3.使用事件處理功能
QTimer
如果要在應用程式中週期性地進行某項操作,就需要用到QTimer(定時器),QTimer類中的常用方法如下所示:
方法 | 描述 |
---|---|
start(milliseconds) | 啟動或重新啟動定時器,時間間隔單位為毫秒 |
stop() | 停止定時器 |
QTimer類中的常用訊號如下所示:
訊號 | 描述 |
---|---|
singleShot | 在給定的時間間隔後呼叫一個槽函式時發射此訊號 |
timeout | 當定時器超時時發射此訊號 |
示例一:顯示時間(timeout訊號)
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QListWidget, QGridLayout, QLabel from PyQt5.QtCore import QTimer, QDateTime import sys class WinForm(QWidget): def __init__(self, parent=None): super(WinForm, self).__init__(parent) self.setWindowTitle("QTimer demo") self.label = QLabel('顯示當前時間') self.startBtn = QPushButton('開始') self.endBtn = QPushButton('結束') layout = QGridLayout(self) # 初始化一個定時器 self.timer = QTimer(self) # 將定時器超時訊號與槽函式showTime()連線 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): # 設定計時間隔並啟動,每隔1000毫秒(1秒)傳送一次超時訊號,迴圈進行 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 = WinForm() form.show() sys.exit(app.exec_())
示例二:視窗自動消失(singleShot訊號)
import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * if __name__ == '__main__': app = QApplication(sys.argv) label = QLabel("<font color=red size=128><b>Hello PyQT,視窗會在5秒後消失!</b></font>") # 無邊框視窗 label.setWindowFlags(Qt.SplashScreen | Qt.FramelessWindowHint) label.show() # 設定5s後自動退出 QTimer.singleShot(5000, app.quit) sys.exit(app.exec_())
接下篇…
--------------------- 本文來自 知諸狹 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/qq_34710142/article/details/80913448?utm_source=copy