1. 程式人生 > 其它 >實戰PyQt5: 099-使用定時器

實戰PyQt5: 099-使用定時器

技術標籤:編碼pythonpyqt5pyside2qtgui程式設計

在Qt中有兩種使用定時器的方法,一種方法是使用QObject類的定時器;另一種方法是使用QTimer類。

QObect類的定時器

通過呼叫QObject.startTimer(),可以啟動一個引數以毫秒為時間單位間隔的定時器,這個函式返回一個唯一的整數定時器的識別符號。該定時器開始就會在每一個時間間隔"觸發",直到明確的使用這個定時器的識別符號來呼叫QObject.killTimer()來結束它。當定時器觸發時,應用程式會發送一個QTimerEvent()事件。在Qt事件迴圈中,處理器按照事件佇列的順序來處理定時器事件。如果處理器正忙於其它事件處理時,定時器就不能被立即處理。

startTimer的格式為:

int QObject.startTimer (self, int interval[,Qt.TimerType timerType = Qt.CoarseTimer])

它啟動一個定時器並返回該定時器的ID, 如果未能成功啟動定時器,將返回0。定時器啟動後,直到呼叫killTimer()刪除該定時器前,每隔interval毫秒時間間隔將觸發一次超時事件。如果interval為0,那麼定時器事件在沒有視窗系統事件需要處理時都會觸發。引數timerType的型別為列舉型別Qt.TimerType,它包含三個可用值:

  • Qt.PreciseTimer (0):精確定時器:儘可能保持毫秒準確;
  • Qt.CoarseTimer (1): 低精度定時器:5%的誤差間隔;
  • Qt.VeryCoarseTimer(2): 特低精度定時器:只能到秒級。

timerEvent的格式為:

timerEvent(self,QTimerEvent qEvent)

通過QTimerEvent的timerId()可以取得定時器的ID。

killTimer的格式為:

killTimer(self,int id)

中止通過startTimer獲得的id定時器。

測試QObject的定時器功能

在視窗中建立一個顯示當前時間的時鐘,點選'啟動'按鈕後,開始顯示時間,點選'停止'按鈕,終止時間更新。完整程式碼如下:

importsys,time
fromPyQt5importQtCore,QtGui,QtWidgets
fromPyQt5.QtCoreimportQt
fromPyQt5.QtWidgetsimport(QApplication,QWidget,QPushButton,QLCDNumber,QVBoxLayout)

classDemoObjectTimer(QWidget):
def__init__(self,parent=None):
super(DemoObjectTimer,self).__init__(parent)

#設定視窗標題
self.setWindowTitle('實戰PyQt5:QObject定時器演示!')
#設定視窗大小
self.resize(400,200)

self.initUi()

definitUi(self):

self.timer_id=0

self.btnStart=QPushButton('啟動')
self.btnStart.setMinimumHeight(48)
self.btnStart.clicked.connect(self.onButtonStartClicked)
self.start=False

self.lcd=QLCDNumber(self)
#設定液晶顯示的最低高度
self.lcd.setMinimumHeight(100)
#設定數字位數
self.lcd.setDigitCount(8)
#設定數字顯示模式,十進位制
self.lcd.setMode(QLCDNumber.Dec)
#設定數字屏顯示樣式
self.lcd.setSegmentStyle(QLCDNumber.Flat)
#設定外觀樣式
self.lcd.setStyleSheet("border:2pxsolidblack;color:red;background:blue;")

vLayout=QVBoxLayout(self)
vLayout.addWidget(self.lcd)
vLayout.addStretch()
vLayout.addWidget(self.btnStart)

self.setLayout(vLayout)

defonButtonStartClicked(self):
ifself.start:
self.start=False
self.btnStart.setText('啟動')
if(self.timer_id):
self.killTimer(self.timer_id)
self.timer_id=0
self.lcd.display('0')
else:
self.start=True
self.btnStart.setText('停止')
self.timer_id=self.startTimer(1000,Qt.VeryCoarseTimer)

deftimerEvent(self,event):
self.lcd.display(time.strftime('%H:%M:%S'))

if__name__=='__main__':
app=QApplication(sys.argv)
window=DemoObjectTimer()
window.show()
sys.exit(app.exec())

執行效果如下圖:

實戰PyQt5: 099-使用定時器

測試QObject類的定時器

使用QTimer

QTimer類提供了重複和單次觸發訊號的定時器。QTimer類為定時器提供了一個高級別的程式設計介面。 很容易使用QTimer:首先建立一個QTimer,連線timeout()訊號到適當的槽函式,並呼叫start(),然後在恆定的時間間隔會發射timeout()訊號。

注意:當QTimer的父物件被銷燬時,它也會被自動銷燬。

QTimer的常用方法有:

  • setInterval(self,int msec): 定時器觸發的時間間隔毫秒數。如果interval為0,那麼定時器事件在沒有視窗系統事件需要處理時都會發生。
  • startTimer(self.[int msec]): 啟動定時器。
  • stop(self): 停止定時器。
  • isActive(self): 如果定時器在執行,返回True,否則,返回False。
  • timerId(self): 如果定時器在執行,返回定時器的ID,否則,返回-1。
  • interval(self): 返回setInterval()的設定值。
  • setSingleShot(self,bool asingleShot) 如果為True,定時器只工作一次;否則重複工作。
  • setTimerType(self,Qt.TimerType timerType): 指定定時器的型別,引數可參照QObject.startTimer()。
  • timerType(): 返回setTimerType()的設定值。

可以通過設定setSingleShot(true)來讓定時器只執行一次。也可以使用靜態函式QTimer.singleShot()。如:

QTimer.singleShot(200, self.updateTimer);

QTimer發出的訊號:

  • timeout():定時器超時後,這個訊號被髮射。這是一個私有的訊號。它可以在訊號連線使用,但不能由使用者發出。

測試QTimer

使用QTimer實現上面的測試例子,完整程式碼如下:

importsys,time
fromPyQt5importQtCore,QtGui,QtWidgets
fromPyQt5.QtCoreimportQt,QTimer
fromPyQt5.QtWidgetsimport(QApplication,QWidget,QPushButton,QLCDNumber,QVBoxLayout)

classDemoTimer(QWidget):
def__init__(self,parent=None):
super(DemoTimer,self).__init__(parent)

#設定視窗標題
self.setWindowTitle('實戰PyQt5:QTimer定時器演示')
#設定視窗大小
self.resize(400,200)

self.initUi()

definitUi(self):

self.timer=QTimer(self)
self.timer.timeout.connect(self.onTimeOut)

self.btnStart=QPushButton('啟動')
self.btnStart.setMinimumHeight(48)
self.btnStart.clicked.connect(self.onButtonStartClicked)
self.start=False

self.lcd=QLCDNumber(self)
#設定液晶顯示的最低高度
self.lcd.setMinimumHeight(100)
#設定數字位數
self.lcd.setDigitCount(8)
#設定數字顯示模式,十進位制
self.lcd.setMode(QLCDNumber.Dec)
#設定數字屏顯示樣式
self.lcd.setSegmentStyle(QLCDNumber.Flat)
#設定外觀樣式
self.lcd.setStyleSheet("border:2pxsolidblack;color:red;background:blue;")

vLayout=QVBoxLayout(self)
vLayout.addWidget(self.lcd)
vLayout.addStretch()
vLayout.addWidget(self.btnStart)

self.setLayout(vLayout)

defonButtonStartClicked(self):
ifself.start:
self.start=False
self.btnStart.setText('啟動')
self.timer.stop()
self.lcd.display('0')
else:
self.start=True
self.btnStart.setText('停止')
self.timer.start(1000)

defonTimeOut(self):
self.lcd.display(time.strftime('%H:%M:%S'))

if__name__=='__main__':
app=QApplication(sys.argv)
window=DemoTimer()
window.show()
sys.exit(app.exec())

執行結果如下圖:

實戰PyQt5: 099-使用定時器

測試QTimer定時器

本文知識點

  • 使用QObject類的定時器功能;
  • QTimerEvent定時器事件;
  • 使用QTimer定時器;
  • QTimer.singleShot()單次定時器。

前一篇:實戰PyQt5: 098-滑鼠事件