第九篇 -- 定时器和计时器

效果:

ui_timer.py

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

# Form implementation generated from reading ui file ‘ui_timer.ui‘
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(343, 229)
        self.groupBox = QtWidgets.QGroupBox(Form)
        self.groupBox.setGeometry(QtCore.QRect(20, 10, 301, 91))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.groupBox.setFont(font)
        self.groupBox.setObjectName("groupBox")
        self.btnStart = QtWidgets.QPushButton(self.groupBox)
        self.btnStart.setGeometry(QtCore.QRect(20, 20, 121, 23))
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.btnStart.setFont(font)
        self.btnStart.setObjectName("btnStart")
        self.btnStop = QtWidgets.QPushButton(self.groupBox)
        self.btnStop.setGeometry(QtCore.QRect(160, 20, 121, 23))
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.btnStop.setFont(font)
        self.btnStop.setObjectName("btnStop")
        self.btnSetIntv = QtWidgets.QPushButton(self.groupBox)
        self.btnSetIntv.setGeometry(QtCore.QRect(20, 60, 121, 23))
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.btnSetIntv.setFont(font)
        self.btnSetIntv.setObjectName("btnSetIntv")
        self.spinBoxIntv = QtWidgets.QSpinBox(self.groupBox)
        self.spinBoxIntv.setGeometry(QtCore.QRect(160, 60, 121, 22))
        font = QtGui.QFont()
        font.setFamily("MS Shell Dlg 2")
        font.setBold(False)
        font.setWeight(50)
        self.spinBoxIntv.setFont(font)
        self.spinBoxIntv.setMaximum(2000)
        self.spinBoxIntv.setSingleStep(1)
        self.spinBoxIntv.setStepType(QtWidgets.QAbstractSpinBox.DefaultStepType)
        self.spinBoxIntv.setProperty("value", 1000)
        self.spinBoxIntv.setDisplayIntegerBase(10)
        self.spinBoxIntv.setObjectName("spinBoxIntv")
        self.groupBox_2 = QtWidgets.QGroupBox(Form)
        self.groupBox_2.setGeometry(QtCore.QRect(20, 110, 301, 81))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.groupBox_2.setFont(font)
        self.groupBox_2.setObjectName("groupBox_2")
        self.LCDHour = QtWidgets.QLCDNumber(self.groupBox_2)
        self.LCDHour.setGeometry(QtCore.QRect(20, 20, 81, 51))
        self.LCDHour.setDigitCount(2)
        self.LCDHour.setSegmentStyle(QtWidgets.QLCDNumber.Flat)
        self.LCDHour.setObjectName("LCDHour")
        self.LCDMin = QtWidgets.QLCDNumber(self.groupBox_2)
        self.LCDMin.setGeometry(QtCore.QRect(110, 20, 81, 51))
        self.LCDMin.setDigitCount(2)
        self.LCDMin.setSegmentStyle(QtWidgets.QLCDNumber.Flat)
        self.LCDMin.setObjectName("LCDMin")
        self.LCDSec = QtWidgets.QLCDNumber(self.groupBox_2)
        self.LCDSec.setGeometry(QtCore.QRect(200, 20, 81, 51))
        self.LCDSec.setDigitCount(2)
        self.LCDSec.setSegmentStyle(QtWidgets.QLCDNumber.Flat)
        self.LCDSec.setObjectName("LCDSec")
        self.LabElapsedTime = QtWidgets.QLabel(Form)
        self.LabElapsedTime.setGeometry(QtCore.QRect(10, 200, 371, 16))
        self.LabElapsedTime.setObjectName("LabElapsedTime")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "定时器"))
        self.groupBox.setTitle(_translate("Form", "定时器"))
        self.btnStart.setText(_translate("Form", "开始"))
        self.btnStop.setText(_translate("Form", "停止"))
        self.btnSetIntv.setText(_translate("Form", "设置周期"))
        self.spinBoxIntv.setSuffix(_translate("Form", "  ms"))
        self.groupBox_2.setTitle(_translate("Form", "当前时间(小时:分:秒)"))
        self.LabElapsedTime.setText(_translate("Form", "     "))

myWidget_timer.py

#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
"""=================================================
@Project -> File    : Operate-system -> myWidget_tiner.py
@IDE     : PyCharm
@Author  : zihan
@Date    : 2020/4/10 9:25
@Desc    :
================================================="""

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

from ui_timer import Ui_Form

class QmyWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)

        self.timer = QTimer()  # 创建定时器
        self.timer.stop()  # 停止
        self.timer.setInterval(1000)  # 定时周期1000ms
        self.timer.timeout.connect(self.do_timer_timeout)
        self.counter = QTime()  # 创建计时器

    def on_btnStart_clicked(self):
        self.timer.start()  # 开始定时
        self.counter.start()
        self.ui.btnStart.setEnabled(False)
        self.ui.btnStop.setEnabled(True)
        self.ui.btnSetIntv.setEnabled(False)

    def on_btnSetIntv_clicked(self):  # #设置定时器的周期
        self.timer.setInterval(self.ui.spinBoxIntv.value())

    def on_btnStop_clicked(self):
        self.timer.stop()  # 定时器停止
        tmMs = self.counter.elapsed()  # 计时器经过的毫秒数
        ms = tmMs % 1000  # 取余数,毫秒
        sec = tmMs/1000  # 整秒
        timeStr = "经过的时间:%d 秒,%d 毫秒" % (sec, ms)
        self.ui.LabElapsedTime.setText(timeStr)
        self.ui.btnStart.setEnabled(True)
        self.ui.btnStop.setEnabled(False)
        self.ui.btnSetIntv.setEnabled(True)

    def do_timer_timeout(self):  # 定时中断响应
        curTime = QTime.currentTime()  # 获取当前时间
        self.ui.LCDHour.display(curTime.hour())
        self.ui.LCDMin.display(curTime.minute())
        self.ui.LCDSec.display(curTime.second())

if __name__ == "__main__":
    app = QApplication(sys.argv)  # 创建app,用QApplication类
    form = QmyWidget()
    form.show()
    sys.exit(app.exec_())

PyQt5中的定时器类是QTimer。QTimer不是一个可见的界面组件,在Qt Designer的组件面板里找不到它。

QTimer主要的属性是interval,是定时中断的周期,单位是毫秒。

QTimer主要的信号是timeout(),在定时中断时发射此信号,若要在定时中断里作出响应,就需要编写与timeout()信号关联的槽函数。

功能分析:

(1)构造函数功能

在构造函数中创建了定时器对象self.timer并立刻停止。设置定时周期为1000ms,并为其timeout()信号关联了自定义槽函数do_timer_timeout()。

还创建了一个计时器对象self.counter,这是一个QTime类的实例,用于在开始与停止之间计算经过的时间。

(2)定时器开始运行

点击“开始”按钮后,定时器开始运行,计时器也开始运行。定时器的定时周期到了之后发射timeout()信号,触发关联的自定义槽函数do_timer_timeout()执行,此槽函数的功能通过类函数QTime.currentTime()读取当前时间,然后将时、分、秒显示在三个LCD组件上。

(3)定时器停止运行

点击“停止”按钮时,定时器停止运行。计时器通过调用elapsed()函数可以获得上次执行start()之后经过的毫秒数。

提示:计时器没有stop,每次start都是从0开始计时。

原文地址:https://www.cnblogs.com/smart-zihan/p/12677700.html

时间: 2024-10-29 21:28:13

第九篇 -- 定时器和计时器的相关文章

Cocos2d-x3.0游戏实例之《别救我》第九篇——从tmx文件中加载关卡怪物

上一篇我们已经制作好tg1.tmx文件了,现在就要使用它了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blog/archives/944 文章来源:笨木头与游戏开发 很抱歉,我们又要新建2个类了,我已经尽力少新建类了,毕竟是教程,类越多越容易混乱. 我们要新建一个Monster类,以及一个MonsterLayer类,专门添加Monster对象. Monster类 来看看Monster.h文件: #ifndef Monste

Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memc

第九篇 Integration Services:控制流任务错误

本篇文章是Integration Services系列的第九篇,详细内容请参考原文. 简介在前面三篇文章,我们创建了一个新的SSIS包,学习了脚本任务和优先约束,并检查包的MaxConcurrentExecutables属性.我们检查.演示并测试优先约束赋值为"成功"."完成"."失败"时对工作流的影响.我们学习了SSIS变量和表达式,并将它们应用到优先约束.这一篇,we introduce fault tolerance by examinin

第九篇 Replication:复制监视器

本篇文章是SQL Server Replication系列的第九篇,详细内容请参考原文. 复制监视器允许你查看复制配置组件的健康状况.这一篇假设你遵循前八篇,并且你已经有一个合并发布和事务发布.启动复制监控器复制监视器不是SSMS的一部分,它是一个独立的可执行文件(SqlMonitor.exe).在一个标准的SQL Server安装中开始菜单下找不到复制监视器.启动复制监视器的最简单方法是:SSMS对象资源管理器下连接到发布服务器,右击你的发布选择"启动复制监视器",如图9.1所示:图

用仿ActionScript的语法来编写html5——第九篇,仿URLLoader读取文件

第九篇,仿URLLoader读取文件 先看看最后的代码 function readFile(){ urlloader = new LURLLoader(); urlloader.addEventListener(LEvent.COMPLETE,readFileOk); urlloader.load("../file/test.txt","text"); } function readFileOk(){ mytxt.text = urlloader.data; } 基

Python之路【第九篇】:Python基础(26)——socket server

socketserver Python之路[第九篇]:Python基础(25)socket模块是单进程的,只能接受一个客户端的连接和请求,只有当该客户端断开的之后才能再接受来自其他客户端的连接和请求.当然我 们也可以通过python的多线程等模块自己写一个可以同时接收多个客户端连接和请求的socket.但是这完全没有必要,因为python标准库已经为 我们内置了一个多线程的socket模块socketserver,我们直接调用就可以了,完全没有必要重复造轮子. 我们只需简单改造一下之前的sock

第九篇 SQL Server代理了解作业和安全

本篇文章是SQL Server代理系列的第九篇,详细内容请参考原文 在这系列的前几篇,学习了如何在SQL Server代理作业步骤启动外部程序.你可以使用过时的ActiveX系统,运行批处理命令脚本,甚至自己的程序.你最好的选择是使用PowerShell的子系统运行PowerShell脚本.PowerShell脚本将允许你处理几乎所有方面的Windows和SQL Server问题.在这一篇,你会深入到SQL Server代理安全.安全是个令人困惑的话题,它值得一些明确的考虑.这系列有两个不同方面

学习java随笔第九篇:java异常处理

在java中的异常处理和c#中的异常处理是一样的都是用try-catch语句. 基本语法如下 try { //此处是可能出现异常的代码 } catch(Exception e) { //此处是如果发生异常的处理代码 } finally语句 try { //此处是可能出现异常的代码 } catch(Exception e) { //此处是如果发生异常的处理代码 } finally { //此处是肯定被执行的代码 } 抛出异常 使用thows和throw语句抛出异常 public static vo

SQL Server索引 - 索引(物化)视图 <第九篇>

一.索引视图基本概念 索引视图实际上是一种将一组唯一值“物化”为群集索引形式的视图,所为物化就是几乎和表一样,其数据也是会存储一份的(会占用硬盘空间,但是查询速度快,例如可以将count(),sum()等值设在索引视图中).其优点是它在提取视图背后的信息方面提供了一个非常快的查找方法.在第一个索引(必须是针对一组唯一值的聚集索引)之后,通过使用来自第一个索引的聚集键作为参考点,SQL Server还能在视图上建立额外的索引.其限制如下: 视图必须使用SCHEMABINDING选项: 如果视图引用