本文简单介绍事件的机制。主要介绍定时器Timer的使用,介绍参数的含义,并通过一个案例来介绍具体如何使用。同时需要注意的是再定义类时,封装的程度过高或者过于死板是否合理。

事件机制(了解)

  • 0.用户的操作会产生各种消息事件(比如点击、输入数据等)
  • 1.第一个接收到消息的是操作系统(win10、乌班图系统、Mac苹果系统等都是操作系统),操作系统会将消息分发到对应的应用程序“消息队列”中。此处的对应是指在哪个应用程序中操作的就会在哪个应用程序中表现,比如在qq中点击的不能跑到微信中去表现。
  • 2、事件机制过程

定时器

startTimer(ms, QtTimeType)——>timer_id

  • 开启一个定时器

  • ms表示时间参数为毫秒,1000毫秒等于1秒

  • QtTimeType:控制时间的精度

    • QtPreciseTimer:精确计时器尽可能到毫秒精度

      QtCoarseTimer:粗计时器试图保持精度在预期间隔的5%以内。

      QtVeryCoarseTimer:非常粗糙的计时器,只能到秒。

  • timer_id:定时器唯一的标识

killTimer(timer_id)

根据计时器id,结束定时器

timeEvent()

定时器执行事件

定时器demo

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys


class MyObject(QObject):
    def timerEvent(self, evt):  # evt表示计时器事件
        print(evt, "1")


# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)

# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("定时器的使用")  # 标题
window.resize(500, 500)  # 窗口的大小
window.move(400, 200)  # 窗口初次显示的位置

# 创建其他控件
obj = MyObject()
timer_id = obj.startTimer(1000)
# obj.killTimer(timer_id) # 关闭定时器

window.show()  # 显示窗口,不然啥也没有

sys.exit(app.exec_())

运行效果:

PyQt定时器运行效果

定时器案例

要求:

  • 创建一个窗口,并且设置一个子控件QLabel
  • 展示十秒倒计时,倒计时结束,即停止计时
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys


class MyLabel(QLabel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setText("10")
        self.move(100, 100)
        self.setStyleSheet("font-size:22px")
        self.timer_id = self.startTimer(1000)

    def timerEvent(self, *args, **kwargs):  # evt表示计时器事件
        # 1获取当前的标签的内容
        sec = int(self.text())
        sec -= 1
        self.setText(str(sec))
        print(sec)
        if sec == 0:
            print("停止")
            self.killTimer(self.timer_id)


# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)

# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("定时器的使用")  # 标题
window.resize(500, 500)  # 窗口的大小
window.move(400, 200)  # 窗口初次显示的位置

# 创建其他控件
label = MyLabel(window)

window.show()  # 显示窗口,不然啥也没有

sys.exit(app.exec_())

演示效果

但是这个写法的封装程度太高,其实可以将一些自定义设置出来:

改进版的写法(可以自定义倒计时的快慢以及倒计时的起点):

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys


class MyLabel(QLabel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setText("10")
        self.move(100, 100)
        self.setStyleSheet("font-size:22px")

    def SetSec(self, sec):
        self.setText(str(sec))

    def MyStartTimer(self, ms):
        self.timer_id = self.startTimer(ms)

    def timerEvent(self, *args, **kwargs):  # evt表示计时器事件
        # 1获取当前的标签的内容
        sec = int(self.text())
        sec -= 1
        self.setText(str(sec))
        print(sec)
        if sec == 0:
            print("停止")
            self.killTimer(self.timer_id)


# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)

# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("定时器的使用")  # 标题
window.resize(500, 500)  # 窗口的大小
window.move(400, 200)  # 窗口初次显示的位置

# 创建其他控件
label = MyLabel(window)
label.SetSec(4)  # 设置起始的时间
label.MyStartTimer(500)  # 倒计时间隔的时间,设为500毫秒


window.show()  # 显示窗口,不然啥也没有

sys.exit(app.exec_())

博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/PyQtTimer.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 07 月 09 日
如果觉得我的文章对你有用,请随意赞赏