找回密码
 会员注册
查看: 31|回复: 0

pythonPyQt5事件机制、定时器原理分析和实战演练

[复制链接]

3

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2024-9-5 10:49:41 | 显示全部楼层 |阅读模式
✨✨欢迎大家来到景天科技苑✨✨🎈🎈养成好习惯,先赞后看哦~🎈🎈🏆作者简介:景天科技苑🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。🏆《博客》:Python全栈,前后端开发,小程序开发,云原生K8S,人工智能,js逆向,App逆向,网络系统安全,数据分析,PyQt5,tkinter,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:PyQt5桌面应用开发,零基础到进阶应用实战景天的主页:景天科技苑文章目录PyQt5事件机制PyQt5事件处理的APIPyQt5事件机制演练PyQt5定时器定时器的操作方法有两种(1)利用每个对象包含的timerEvent函数(2)利用定时器模块QTimerPyQt5事件机制PyQt为事件处理提供了两种机制:高级的信号与槽机制,以及低级的事件处理机制。信号与槽可以说是对事件处理机制的高级封装。事件机制更偏向于底层。常见事件类型:键盘事件:按键按下和松开。鼠标事件:鼠标指针移动,鼠标按下和松开。拖放事件:用鼠标进行拖放。滚轮事件:鼠标滚轮滚动。绘屏事件:重绘屏幕的某些部分。定时事件:定时器到时。焦点事件:键盘焦点移动。进入/离开事件:鼠标指针移入Widget内,或者移出。移动事件:Widget的位置改变。大小改变事件:Widget的大小改变。显示/隐藏事件:Widget显示和隐藏。窗口事件:窗口是否为当前窗口。PyQt提供了如下5种事件处理和过滤方法(有弱到强):重新实现事件函数,比如mousePressEvent(),keyPressEvent()等等。重新实现QObject.event()。安装时间过滤器。在QApplication中安装事件过滤器。重新实现QAppliction的notifiy()方法。PyQt5事件处理的APIPyQt5事件机制演练importsysfromPyQt5.Qtimport*#通过继承,重新notify方法#事件会分发给对象里面的notify方法classApp(QApplication):#notify第一个参数是控件类型(事件接收者),第二个是事件类型defnotify(self,recevier,evt):#notify会监控所有的事件,对事件进行分发。为了打印鼠标点击按钮产生的事件,我们进行了过滤#过滤事件接收者是按钮,事件类型是鼠标按钮按下#evt属于QEvent类型。QEvent类型里面有个type方法,用来判断事件类型ifrecevier.inherits("QPushButton")andevt.type()==QEvent.MouseButtonPress:print(recevier,evt)#优先调用子类notify方法,由于我们没有写具体功能,什么也做不了,会报错,为了防止程序报错,需要将父类的notify方法返回#这行代码就是负责分发的returnsuper().notify(recevier,evt)#写个子类,过滤event事件类型classBtn(QPushButton):#事件会分发给按钮对象的event方法,event里面包含很多事件defevent(self,evt):ifevt.type()==QEvent.MouseButtonPress:print(evt)#根据事件类型再次进行分发,根据不同事件调用不同事件函数returnsuper().event(evt)#重写鼠标被按下事件函数defmousePressEvent(self,*args,**kwargs):print("鼠标被按下了......")#返回父类鼠标事件函数,进而发射信号给槽,调用槽函数#如果不返回,则不会发射信号给槽returnsuper().mousePressEvent(*args,**kwargs)app=App(sys.argv)window=QWidget()#设置主题window.setWindowTitle("事件机制")btn=Btn(window)btn.setText("按钮")btn.move(100,100)defcao():print("按钮被点击了")#按键按下btn.pressed.connect(cao)window.show()sys.exit(app.exec_())123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354运行点击按钮可见事件被触发PyQt5定时器在基于PyQt5的应用程序开发过程中经常会遇到一些需要循环执行的任务,即定时多长时间任务循环一次。常用于数据库定时更新、界面刷新、内存清理、脚本任务运行、进度条等需要定时更新的程序段,小到某一参数的定时更新,大到整个线程任务的更新、程序段的循环定时执行。本文将详细介绍如何在PyQt5中使用定时器,包括定时器的基本原理、创建和使用定时器的方法以及一些实际应用案例。定时器的操作方法有两种方法一:利用每个对象包含的timerEvent函数方法二:利用定时器模块需要fromPyQt5.QtCoreimportQTimer(1)利用每个对象包含的timerEvent函数API介绍已经案例演示#0.导入需要的包和模块fromPyQt5.Qtimport*importsys#自定义一个类继承QObejct#classMyObject(QObject):#deftimerEvent(self,evt):#重写对象的定时器函数#print(evt,"1")#自定义个类继承QLabel,可以重写父类方法,尤其是timerEvent对象的定时器函数classMyLabel(QLabel):#增加参数接收*args,**kwargsdef__init__(self,*args,**kwargs):#当我们继承某个类时,需要调用父类构造方法#加载父类初始化方法super().__init__(*args,**kwargs)self.setText("10")self.move(235,235)self.setStyleSheet("font-size:28px;")#设置标签上展示的初始数字defsetSec(self,sec):self.setText(str(sec))defstartMyTimer(self,ms):#可以创建多个,每个startTimer返回的id不同#每个一定的时间,就会自动执行对象中的timerEvent函数#参数1间隔时间,单位毫秒self.timer_id=self.startTimer(ms,timerType=Qt.PreciseTimer)#启动对象定时器函数deftimerEvent(self,*args,**kwargs):print("倒计时进行中")#1.获取当前的标签的内容current_sec=int(self.text())current_sec-=1#将内容以字符串形式展示,整形数据没法直接放进来self.setText(str(current_sec))#当前数字减为0时,停止定时器ifcurrent_sec==0:print("倒计时停止")#释放对象的定时器函数self.killTimer(self.timer_id)classMyWidget(QWidget):defstartMyTimer(self,ms):#可以创建多个,每个startTimer返回的id不同#每个一定的时间,就会自动执行对象中的timerEvent函数#参数1间隔时间,单位毫秒self.widget_id=self.startTimer(ms,timerType=Qt.PreciseTimer)#启动对象定时器函数deftimerEvent(self,*args,**kwargs):#获取当前窗口的高和宽current_w=self.width()current_h=self.height()#定时器每执行一次,窗口长和高都加10self.resize(current_w+10,current_h+10)print("当前窗口高度",current_h)#设置当前窗口高度达到550时,停止定时器ifcurrent_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_())1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192运行当到达临界值,定时器停止(2)利用定时器模块QTimer需要导包fromPyQt5.QtCoreimportQTimerQTimer的事件可以通过QTimer.timeout.connect()信号槽绑定到对应的处理函数上。例如,在下面的示例中,定义了一个onTimer()函数,每当定时器时间到达时,就会执行这个函数。要启动QTimer定时器,需要调用QTimer.setInterval()方法,并传入时间间隔,单位为毫秒(ms)。例如,传入1000表示每隔1000毫秒(即1秒)会触发一次operate()。需要注意的是,定时器不仅仅是触发一次,而是持续按照设定的时间间隔触发,直到调用QTimer.stop()方法停止。importsysfromPyQt5.Qtimport*classwin(QWidget):#创建一个类,为了集成控件#增加参数接收*args,**kwargsdef__init__(self,*args,**kwargs):#当我们继承某个类时,需要调用父类构造方法super().__init__(*args,**kwargs)self.setWindowTitle('定时器的使用')self.resize(300,300)self.num=0self.setup_ui()defsetup_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()#定时器要执行的动作defoperate(self):self.num=self.num+1print(self.num)#动态设置标签显示数字self.lable.setText(str(self.num))#设置定时器停止阈值ifself.num==5:print("计时停止")self.timer.stop()if__name__=='__main__':app=QApplication(sys.argv)#创建应用window=win()window.show()sys.exit(app.exec_())12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152运行当num数值增加到5时,定时器停止
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-7 05:52 , Processed in 1.016259 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表