加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

PyQt5编程(15):定时器的使用

(2017-09-08 15:14:03)
标签:

杂谈

分类: PYTHON
    在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器;一种是使用QTimer类。
1.QObject类的定时器

        通过QObject.startTimer(),可以把一个一毫秒为单位的时间间隔作为参数来开始定时器,这个函数返回一个唯一的整数定时器的标识符。这个定时器开始就会在每一个时间间隔"触发",直到明确的使用这个定时器的标识符来调用QObject.killTimer()结束。

    当定时器触发时,应用程序会发送一个QTimerEvent()事件。在事件循环中,处理器按照事件队列的顺序来处理定时器事件。当处理器正忙于其它事件处理时,定时器就不能立即处理。

     startTimer的格式为:
     int QObject.startTimer (self, int interval[,Qt.TimerType timerType = Qt.CoarseTimer])  
     开始一个定时器并返回定时器ID,在中止定时器时要用到。如果不能开始一个定时器,将返回0。定时器开始后,每隔interval毫秒间隔将触发一次超时事件,直到killTimer()被调用来删除定时器。如果interval为0,那么定时器事件在没有窗口系统事件需要处理时都会发生。
    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定时器。

    下面的代码为在窗口中创建一个显示当前系统时间的时钟,并有时钟启动和停止的按钮。

# -*- 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("窗口中的时钟")
        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的构造函数为:
    QTimer([parent=None])
    方法有:
    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)  指定定时器的类型,参数可参照startTimer()。
    
timerType()   返回setTimerType()的设定值。

    下列是用QTimer实现前面例子功能的代码:

# -*- 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("窗口中的时钟")
        self.resize(200, 100)
        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)
        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_())


     






    




0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有