脚本之家

电脑版
提示:原网页已由神马搜索转码, 内容由www.jb51.net提供.
您的位置:首页脚本专栏python→ PyQt5事件机制和定时器

python PyQt5事件机制和定时器原理分析及用法详解

  更新时间:2024年07月05日 09:14:36  作者:景天科技苑 
PyQt为事件处理提供了两种机制:高级的信号与槽机制,以及低级的事件处理机制,在基于PyQt5的应用程序开发过程中经常会遇到一些需要循环执行的任务,即定时多长时间任务循环一次,本文给大家介绍了python PyQt5事件机制和定时器原理和用法,需要的朋友可以参考下

PyQt5事件机制

PyQt为事件处理提供了两种机制:高级的信号与槽机制,以及低级的事件处理机制。信号与槽可以说是对事件处理机制的高级封装。事件机制更偏向于底层。

常见事件类型:

键盘事件:按键按下和松开。

鼠标事件:鼠标指针移动,鼠标按下和松开。

拖放事件:用鼠标进行拖放。

滚轮事件:鼠标滚轮滚动。

绘屏事件:重绘屏幕的某些部分。

定时事件:定时器到时。

焦点事件:键盘焦点移动。

进入/离开事件:鼠标指针移入Widget内,或者移出。

移动事件:Widget的位置改变。

大小改变事件:Widget的大小改变。

显示/隐藏事件:Widget显示和隐藏。

窗口事件:窗口是否为当前窗口。

PyQt提供了如下5种事件处理和过滤方法(有弱到强):

重新实现事件函数,比如mousePressEvent(),keyPressEvent()等等。

重新实现QObject.event()。

安装时间过滤器。

在QApplication中安装事件过滤器。

重新实现QAppliction的notifiy()方法。

在这里插入图片描述

在这里插入图片描述

PyQt5事件处理的API

在这里插入图片描述

PyQt5事件机制演练

import sys
from PyQt5.Qt import *
#通过继承,重新notify方法
#事件会分发给对象里面的notify方法
class App(QApplication):
#notify第一个参数是控件类型(事件接收者),第二个是事件类型
def notify(self, recevier, evt):
#notify会监控所有的事件,对事件进行分发。为了打印鼠标点击按钮产生的事件,我们进行了过滤
#过滤事件接收者是按钮,事件类型是鼠标按钮按下
#evt属于QEvent类型。QEvent类型里面有个type方法,用来判断事件类型
if recevier.inherits("QPushButton") and evt.type() == QEvent.MouseButtonPress:
print(recevier, evt)
#优先调用子类notify方法,由于我们没有写具体功能,什么也做不了,会报错,为了防止程序报错,需要将父类的notify方法返回
#这行代码就是负责分发的
return super().notify(recevier, evt)
#写个子类,过滤event事件类型
class Btn(QPushButton):
#事件会分发给按钮对象的event方法,event里面包含很多事件
def event(self, evt):
if evt.type() == QEvent.MouseButtonPress:
print(evt)
#根据事件类型再次进行分发,根据不同事件调用不同事件函数
return super().event(evt)
#重写鼠标被按下事件函数
def mousePressEvent(self, *args, **kwargs):
print("鼠标被按下了......")
#返回父类鼠标事件函数,进而发射信号给槽,调用槽函数
#如果不返回,则不会发射信号给槽
return super().mousePressEvent(*args, **kwargs)
app = App(sys.argv)
window = QWidget()
#设置主题
window.setWindowTitle("事件机制")
btn = Btn(window)
btn.setText("按钮")
btn.move(100, 100)
def cao():
print("按钮被点击了")
#按键按下
btn.pressed.connect(cao)
window.show()
sys.exit(app.exec_())

运行

在这里插入图片描述

点击按钮

可见事件被触发

在这里插入图片描述

PyQt5定时器

在基于PyQt5的应用程序开发过程中经常会遇到一些需要循环执行的任务,即定时多长时间任务循环一次。

常用于数据库定时更新、界面刷新、内存清理、脚本任务运行、进度条等需要定时更新的程序段,小到某一参数的定时更新,大到整个线程任务的更新、程序段的循环定时执行。

本文将详细介绍如何在PyQt5中使用定时器,包括定时器的基本原理、创建和使用定时器的方法以及一些实际应用案例。

定时器的操作方法有两种

方法一:利用每个对象包含的timerEvent函数

方法二:利用定时器模块 需要 from PyQt5.QtCore import QTimer

(1)利用每个对象包含的timerEvent函数

API介绍已经案例演示

在这里插入图片描述

# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys
#自定义一个类继承QObejct
# class MyObject(QObject):
# def timerEvent(self, evt): #重写对象的定时器函数
# print(evt, "1")
#自定义个类继承QLabel,可以重写父类方法,尤其是timerEvent对象的定时器函数
class MyLabel(QLabel):
#增加参数接收*args, **kwargs
def __init__(self, *args, **kwargs):
# 当我们继承某个类时,需要调用父类构造方法
#加载父类初始化方法
super().__init__(*args, **kwargs)
self.setText("10")
self.move(235, 235)
self.setStyleSheet("font-size: 28px;")
#设置标签上展示的初始数字
def setSec(self, sec):
self.setText(str(sec))
def startMyTimer(self, ms):
#可以创建多个,每个startTimer返回的id不同
#每个一定的时间,就会自动执行对象中的timerEvent函数
#参数1 间隔时间,单位毫秒
self.timer_id = self.startTimer(ms,timerType=Qt.PreciseTimer) #启动对象定时器函数
def timerEvent(self, *args, **kwargs):
print("倒计时进行中")
# 1. 获取当前的标签的内容
current_sec = int(self.text())
current_sec -= 1
#将内容以字符串形式展示,整形数据没法直接放进来
self.setText(str(current_sec))
#当前数字减为0时,停止定时器
if current_sec == 0:
print("倒计时停止")
# 释放对象的定时器函数
self.killTimer(self.timer_id)
class MyWidget(QWidget):
def startMyTimer(self, ms):
#可以创建多个,每个startTimer返回的id不同
#每个一定的时间,就会自动执行对象中的timerEvent函数
#参数1 间隔时间,单位毫秒
self.widget_id = self.startTimer(ms,timerType=Qt.PreciseTimer) #启动对象定时器函数
def timerEvent(self, *args, **kwargs):
#获取当前窗口的高和宽
current_w = self.width()
current_h = self.height()
#定时器每执行一次,窗口长和高都加10
self.resize(current_w + 10, current_h + 10)
print("当前窗口高度", current_h)
#设置当前窗口高度达到550时,停止定时器
if current_h == 550:
print("widget停止")
# 释放对象的定时器函数
self.killTimer(self.widget_id)
if __name__ == '__main__':
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)
# 2. 控件的操作
# 2.1 创建控件
window = MyWidget()
# 2.2 设置控件
window.setWindowTitle("QObject定时器的使用")
window.resize(500, 500)
window.startMyTimer(1000)
#创建第二个控件
label = MyLabel(window)
label.setSec(10)
label.startMyTimer(500)
# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

运行

在这里插入图片描述

当到达临界值,定时器停止

在这里插入图片描述

(2)利用定时器模块QTimer

需要导包 from PyQt5.QtCore import QTimer
QTimer 的事件可以通过 QTimer.timeout.connect() 信号槽绑定到对应的处理函数上。
例如,在下面的示例中,定义了一个 onTimer() 函数,每当定时器时间到达时,就会执行这个函数。

要启动 QTimer 定时器,需要调用 QTimer.setInterval() 方法,并传入时间间隔,单位为毫秒(ms)。
例如,传入 1000 表示每隔 1000 毫秒(即 1 秒)会触发一次 operate()。需要注意的是,定时器不仅仅是触发一次,而是持续按照设定的时间间隔触发,直到调用 QTimer.stop() 方法停止。

import sys
from PyQt5.Qt import *
class win(QWidget): #创建一个类,为了集成控件
# 增加参数接收*args, **kwargs
def __init__(self, *args, **kwargs):
# 当我们继承某个类时,需要调用父类构造方法
super().__init__(*args, **kwargs)
self.setWindowTitle('定时器的使用')
self.resize(300,300)
self.num=0
self.setup_ui()
def setup_ui(self):
#添加个标签,初始化标签
self.lable = QLabel(self)
self.lable.move(120,120)
self.lable.setStyleSheet("font-size: 28px;")
self.timer = QTimer(self) # 初始化一个定时器
# 设置计时间隔;单位毫秒
self.timer.setInterval(1000)
self.timer.timeout.connect(self.operate) # 每次计时到时间时发出信号
#启动定时器,也可以在这里设置时间间隔,例如:self.timer.start(1000) 表示每秒执行一次
self.timer.start()
#定时器要执行的动作
def operate(self):
self.num=self.num+1
print(self.num)
#动态设置标签显示数字
self.lable.setText(str(self.num))
#设置定时器停止阈值
if self.num == 5:
print("计时停止")
self.timer.stop()
if __name__=='__main__':
app=QApplication(sys.argv) #创建应用
window=win()
window.show()
sys.exit(app.exec_())

运行

在这里插入图片描述

当num数值增加到5时,定时器停止

在这里插入图片描述

以上就是python PyQt5事件机制和定时器原理分析及用法详解的详细内容,更多关于PyQt5事件机制和定时器的资料请关注脚本之家其它相关文章!

相关文章

    • 这篇文章主要介绍了fastapi框架异步执行踩坑记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
      2024-06-06
    • 这篇文章主要介绍了python pandas dataframe多列筛选方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
      2023-09-09
    • 这篇文章主要介绍了tensorflow安装成功import tensorflow 出现问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
      2020-04-04
    • 梯度简单来说就是求导。本文主要介绍了OpenCV 图像梯度的实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
      2021-07-07
    • 这篇文章主要介绍了Python多进程同步简单实现代码,涉及Python基于Process与Lock模块运行进程与锁机制实现多进程同步的相关技巧,需要的朋友可以参考下
      2016-04-04
    • 这篇文章主要介绍了在Python的Django框架中用流响应生成CSV文件的教程,作者特别讲到了防止CSV文件中的中文避免出现乱码等问题,需要的朋友可以参考下
      2015-05-05
    • 这篇文章主要介绍了Python实现绘图散点图方式(scatter),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
      2024-06-06
    • 这篇文章主要介绍了ubuntu环境下python虚拟环境的安装搭建过程 ,需要的朋友可以参考下
      2018-01-01
    • 这篇文章主要介绍了安装python时MySQLdb报错的问题描述及解决方法,需要的朋友可以参考下
      2018-03-03
    • 在编写程序时难免会遇到错误,有的是编写人员疏忽造成的语法错误,有的是程序内部隐含逻辑问题造成的数据错误等等,这篇文章主要给大家介绍了关于Python十类常见异常类型总结的相关资料,文中还附捕获及异常处理方式,需要的朋友可以参考下
      2023-06-06

    最新评论