1. 程式人生 > 其它 >PyQt5-定時器QTimer

PyQt5-定時器QTimer

PyQt5中的定時器類是QTimer。QTimer不是一個可見的介面元件,在UI Designer的元件面板裡找不到它。

QTimer主要的屬性是interval,是定時中斷的週期,單位是毫秒。

QTimer主要的訊號是timeout(),在定時中斷時發射此訊號,若要在定時中斷裡做出響應,就需要編寫與timeout()訊號關聯的槽函式。

下圖是我設計的介面

窗體UI檔案Widget.ui在UI Designer裡視覺化設計,介面上元件的佈局和屬性設定見原始檔。窗體業務邏輯類QmyWidget的完整程式碼如下:

import sys
from PyQt5.QtWidgets import  QWidget,QApplication
from PyQt5.QtCore import QTime,QTimer

from ui_QtApp import Ui_Form
class QmyWidget(QWidget):
    def __init__(self,parent=None):
        super().__init__(parent) #呼叫父類建構函式
        self.ui=Ui_Form() #建立UI物件
        self.ui.setupUi(self) #構造UI
        self.timer=QTimer()  #建立定時器
        self.timer.stop() #停止
        self.timer.setInterval(1000) #定時週期1000ms
        self.timer.timeout.connect(self.do_timer_timeout)
        self.counter=QTime() #建立計時器

    ## ====由connectSlotsByName()自動與元件的訊號關聯的槽函式=====
    def on_pushButton_clicked(self): #開始按鈕
        self.timer.start()#開始定時
        self.counter.start() #開始計時
        self.ui.pushButton.setEnabled(False)
        self.ui.pushButton_2.setEnabled(True)
        self.ui.pushButton_3.setEnabled(False)

    def on_pushButton_3_clicked(self): #設定定時器的週期
        self.timer.setInterval(self.ui.spinBox.value())

    def on_pushButton_2_clicked(self): #停止按鈕
        self.timer.stop() #定時器停止
        tmMs=self.counter.elapsed() #計時器經過的毫秒數
        ms=tmMs %1000 #取餘數,毫秒
        sec=tmMs/1000 #整秒
        timeStr="經過的時間:%d秒,%d毫秒"%(sec,ms)
        self.ui.label.setText(timeStr)
        self.ui.pushButton.setEnabled(True)
        self.ui.pushButton_2.setEnabled(False)
        self.ui.pushButton_3.setEnabled(True)

    ## =======自定義槽函式=======
    def do_timer_timeout(self): #定時中斷相應
        curTime=QTime.currentTime() #獲取當前時間
        self.ui.lcdNumber.display(curTime.hour())
        self.ui.lcdNumber_2.display(curTime.minute())
        self.ui.lcdNumber_3.display(curTime.second())

if __name__ == "__main__": ##用於當前窗體測試
    app=QApplication(sys.argv) #建立GUI應用程式
    form=QmyWidget() #建立窗體
    form.show()
    sys.exit(app.exec_())

應用程式主程式appMain.py檔案如下:

## GUI應用程式主程式
import sys
from PyQt5.QtWidgets import  QApplication
from myWidget import  QmyWidget

app = QApplication(sys.argv) # 建立app,用QApplication類
myWidget = QmyWidget() #建立窗體
myWidget.show()
sys.exit(app.exec_())

程式中幾個過程的程式碼功能分析如下。

(1)建構函式功能在建構函式中建立了定時器物件self.timer並立刻停止。設定定時週期為1000ms,併為其timeout()訊號關聯了自定義槽函式do_timer_timeout()。

還建立了一個計時器物件self.counter,這是一個QTime類的例項,用於在開始與停止之間計算經過的時間。

(2)定時器開始執行

點選“開始”按鈕後,定時器開始執行,計時器也開始執行。

定時器的定時週期到了之後發射timeout()訊號,觸發關聯的自定義槽函式do_timer_timeout()執行,此槽函式的功能通過類函式QTime.currentTime()讀取當前時間,然後將時、分、秒顯示在三個LCD元件上。

(3)定時器停止執行

點選“停止”按鈕時,定時器停止執行。計時器通過呼叫elapsed()函式可以獲得上次執行start()之後經過的毫秒數。

最終效果如下: