PyQt5編程(15):定時(shí)器的使用

在Qt中使用定時(shí)器有兩種方法穿扳,一種是使用QObiect類的定時(shí)器;一種是使用QTimer類。
1.QObject類的定時(shí)器

通過(guò)QObject.startTimer()翩腐,可以把一個(gè)一毫秒為單位的時(shí)間間隔作為參數(shù)來(lái)開始定時(shí)器,這個(gè)函數(shù)返回一個(gè)唯一的整數(shù)定時(shí)器的標(biāo)識(shí)符膏燃。這個(gè)定時(shí)器開始就會(huì)在每一個(gè)時(shí)間間隔"觸發(fā)"茂卦,直到明確的使用這個(gè)定時(shí)器的標(biāo)識(shí)符來(lái)調(diào)用QObject.killTimer()結(jié)束。

當(dāng)定時(shí)器觸發(fā)時(shí)组哩,應(yīng)用程序會(huì)發(fā)送一個(gè)QTimerEvent()事件等龙。在事件循環(huán)中处渣,處理器按照事件隊(duì)列的順序來(lái)處理定時(shí)器事件。當(dāng)處理器正忙于其它事件處理時(shí)蛛砰,定時(shí)器就不能立即處理罐栈。

startTimer的格式為:
int QObject.startTimer (self, int interval[,Qt.TimerType timerType = Qt.CoarseTimer])

開始一個(gè)定時(shí)器并返回定時(shí)器ID,在中止定時(shí)器時(shí)要用到。如果不能開始一個(gè)定時(shí)器泥畅,將返回0荠诬。定時(shí)器開始后,每隔interval毫秒間隔將觸發(fā)一次超時(shí)事件位仁,直到killTimer()被調(diào)用來(lái)刪除定時(shí)器柑贞。如果interval為0,那么定時(shí)器事件在沒(méi)有窗口系統(tǒng)事件需要處理時(shí)都會(huì)發(fā)生聂抢。
Qt.TimerType可以有三個(gè)值:
Qt.PreciseTimer 0 精確定時(shí)器:盡可能保持毫秒準(zhǔn)確
Qt.CoarseTimer 1 粗定時(shí)器:5%的誤差間隔
Qt.VeryCoarseTimer 2 很粗的定時(shí)器:只能到秒級(jí)

timerEvent的格式為:
timerEvent(self,QTimerEvent qEvent)
通過(guò)QTimerEvent的timerId()可以取得定時(shí)器的ID钧嘶。

killTimer的格式:
killTimer(self,int Id)
中止通過(guò)startTimer獲得的Id定時(shí)器。

下面的代碼為在窗口中創(chuàng)建一個(gè)顯示當(dāng)前系統(tǒng)時(shí)間的時(shí)鐘琳疏,并有時(shí)鐘啟動(dòng)和停止的按鈕有决。

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtWidgets
import time

class MyWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.setWindowTitle("窗口中的時(shí)鐘")
        self.resize(200, 100)
        self.timer_id = 0
        self.label = QtWidgets.QLabel("")
        self.label.setAlignment(QtCore.Qt.AlignHCenter)
        self.button1 = QtWidgets.QPushButton("開始")
        self.button2 = QtWidgets.QPushButton("停止")
        self.button2.setEnabled(False)
        vbox = QtWidgets.QVBoxLayout()
        vbox.addWidget(self.label)
        vbox.addWidget(self.button1)
        vbox.addWidget(self.button2)
        self.setLayout(vbox)
        self.button1.clicked.connect(self.on_clicked_button1)
        self.button2.clicked.connect(self.on_clicked_button2)

    def on_clicked_button1(self):
        self.timer_id = self.startTimer(1000, timerType = QtCore.Qt.VeryCoarseTimer)
        self.button1.setEnabled(False)
        self.button2.setEnabled(True)

    def on_clicked_button2(self):
        if self.timer_id:
            self.killTimer(self.timer_id)
            self.timer_id = 0
        self.button1.setEnabled(True)
        self.button2.setEnabled(False)

    def timerEvent(self, event):
        self.label.setText(time.strftime("%H:%M:%S"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

除了使用QObject的startTimer()外,還可以使用QtCore模塊中的QTimer類空盼。
QTimer的構(gòu)造函數(shù)為:QTimer([parent=None])

方法有:
setInterval(self,int msec) 定時(shí)器觸發(fā)的時(shí)間間隔毫秒數(shù)书幕。如果interval為0,那么定時(shí)器事件在沒(méi)有窗口系統(tǒng)事件需要處理時(shí)都會(huì)發(fā)生揽趾。
startTimer(self.[int msec]) 起動(dòng)定時(shí)器按咒。
stop(self) 停止定時(shí)器
isActive(self) 如果定時(shí)器在運(yùn)行,返回True但骨,否則励七,返回False。
timerId(self) 如果定時(shí)器在運(yùn)行奔缠,返回定時(shí)器的ID掠抬,否則,返回-1校哎。
interval(self) 返回setInterval()的設(shè)定值两波。
setSingleShot(self,bool asingleShot) 如果為True,定時(shí)器只工作一次闷哆;否則腰奋,重復(fù)工作。
setTimerType(self,Qt.TimerType timerType) 指定定時(shí)器的類型抱怔,參數(shù)可參照startTimer()劣坊。
timerType() 返回setTimerType()的設(shè)定值。

下列是用QTimer實(shí)現(xiàn)前面例子功能的代碼:

# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtWidgets
import time

class MyWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.setWindowTitle("窗口中的時(shí)鐘")
        self.resize(200, 100)
        self.label = QtWidgets.QLabel("")
        self.label.setAlignment(QtCore.Qt.AlignHCenter)
        self.button1 = QtWidgets.QPushButton("開始")
        self.button2 = QtWidgets.QPushButton("結(jié)束")
        self.button2.setEnabled(False)
        vbox = QtWidgets.QVBoxLayout()
        vbox.addWidget(self.label)
        vbox.addWidget(self.button1)
        vbox.addWidget(self.button2)
        self.setLayout(vbox)
        self.button1.clicked.connect(self.on_clicked_button1)
        self.button2.clicked.connect(self.on_clicked_button2)
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.on_timeout);

    def on_clicked_button1(self):
        self.timer.start(1000) # 1 секунда
        self.button1.setEnabled(False)
        self.button2.setEnabled(True)

    def on_clicked_button2(self):
        self.timer.stop()
        self.button1.setEnabled(True)
        self.button2.setEnabled(False)

    def on_timeout(self):
        self.label.setText(time.strftime("%H:%M:%S"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屈留,一起剝皮案震驚了整個(gè)濱河市局冰,隨后出現(xiàn)的幾起案子测蘑,更是在濱河造成了極大的恐慌,老刑警劉巖康二,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碳胳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沫勿,警方通過(guò)查閱死者的電腦和手機(jī)挨约,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)产雹,“玉大人诫惭,你說(shuō)我怎么就攤上這事∏⒐剩” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵盗誊,是天一觀的道長(zhǎng)时甚。 經(jīng)常有香客問(wèn)我,道長(zhǎng)哈踱,這世上最難降的妖魔是什么荒适? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮开镣,結(jié)果婚禮上刀诬,老公的妹妹穿的比我還像新娘。我一直安慰自己邪财,他們只是感情好陕壹,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著树埠,像睡著了一般糠馆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怎憋,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天又碌,我揣著相機(jī)與錄音,去河邊找鬼绊袋。 笑死毕匀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的癌别。 我是一名探鬼主播皂岔,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼展姐!你這毒婦竟也來(lái)了凤薛?” 一聲冷哼從身側(cè)響起姓建,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缤苫,沒(méi)想到半個(gè)月后速兔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡活玲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年涣狗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舒憾。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡镀钓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出镀迂,到底是詐尸還是另有隱情丁溅,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布探遵,位于F島的核電站窟赏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏箱季。R本人自食惡果不足惜涯穷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望藏雏。 院中可真熱鬧拷况,春花似錦、人聲如沸掘殴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奏寨。三九已至蚤告,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間服爷,已是汗流浹背杜恰。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仍源,地道東北人心褐。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像笼踩,于是被迫代替她去往敵國(guó)和親逗爹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容