PyQt5-定時器QTimer
阿新 • • 發佈:2022-05-23
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()之後經過的毫秒數。
最終效果如下: