pyqt5中动画的使用详解


Posted in Python onApril 01, 2020

一、pyqt5中动画的继承关系图

pyqt5中动画的使用详解

二、关于QAbstractAnimation父类的认识

1、主要作用

  • 继承此类, 实现一些自定义动画
  • 所有动画共享的功能

2、功能作用

循环操作

  • setLoopCount(count):设置循环次数
  • currentLoop():当前循环
  • currentLoopTime():当前循环时间

时间操作

  • duration():单次时长
  • totalDuration():动画总时长
  • currentTime():当前时长

动画方向

  • setDirection(QAbstractAnimation.Forward/QAbstractAnimation.Backward)

动画状态state()

  • QAbstractAnimation.Stopped:动画停止
  • QAbstractAnimation.Paused:动画暂停
  • QAbstractAnimation.Running:动画运行

三、QPropertyAnimation属性动画的使用

主要用于实现某个属性值从x到y的动画变化

1、定义动画的主要步骤

  • 创建一个动画,并设置目标、属性
  • 设置属性值的开始、插值、结束
  • 动画时长
  • 启动动画

2、构造函数使用方式

1.QPropertyAnimation(parent: QObject = None)

  • 设置动画目标:setTargetObject(self, QObject)
  • 设置动画属性(位置、大小等):setPropertyName(self, Union[QByteArray, bytes, bytearray])

2.QPropertyAnimation(QObject, Union[QByteArray, bytes, bytearray], parent: QObject = None)

3、常见的属性

  • geometry
  • pos
  • size
  • windowOpacity

4、设置开始值和结束值

  • setStartValue(self, Any)
  • setEndValue(self, Any)
  • setKeyValueAt(self, float, Any)
  • setKeyValues(self, object)

5、设置动画时长

  • setDuration(int mesc)

6、启动动画

  • start()

7、简单案例(位置的)

import sys
from PyQt5.Qt import *


class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('动画')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn = QPushButton(self)
    self.init_ui()

  def init_ui(self):
    self.btn.resize(100, 100)
    self.btn.move(0, 0)
    self.btn.setStyleSheet('QPushButton{border: none; background: pink;}')

    # 1.定义一个动画
    animation = QPropertyAnimation(self)
    animation.setTargetObject(self.btn)
    animation.setPropertyName(b'pos')
    # 使用另外一种构造函数方式创建
    # animation = QPropertyAnimation(self.btn, b'pos', self)

    # 2.设置属性值
    animation.setStartValue(QPoint(0, 0))
    animation.setEndValue(QPoint(400, 400))

    # 3.设置时长
    animation.setDuration(3000)

    # 4.启动动画
    animation.start()


if __name__ == "__main__":
  app = QApplication(sys.argv)
  window = Window()
  window.show()
  sys.exit(app.exec_())

8、使用插值的动画

import sys
from PyQt5.Qt import *


class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('使用插值')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn = QPushButton(self)
    self.init_ui()

  def init_ui(self):
    self.btn.resize(50, 50)
    self.btn.move(0, 0)
    self.btn.setStyleSheet('QPushButton{border: none; background: pink;}')
    
    # 1.创建动画
    animation = QPropertyAnimation(self.btn, b'pos', self)
    
    # 2.定义动画插值
    animation.setKeyValueAt(0, QPoint(0, 0))
    animation.setKeyValueAt(0.25, QPoint(450, 0))
    animation.setKeyValueAt(0.5, QPoint(450, 450))
    animation.setKeyValueAt(0.75, QPoint(0, 450))
    animation.setKeyValueAt(1, QPoint(0, 0))
    # 3.动画时长
    animation.setDuration(5000)
    # 4.启动动画
    animation.start()


if __name__ == "__main__":
  app = QApplication(sys.argv)
  window = Window()
  window.show()
  sys.exit(app.exec_())

四、QAnimationGroup动画组的使用

可以将一组动画, 同时播放或者按顺序播放

1、使用的步骤

  • 根据上面的方式创建单独的动画(但不启动)
  • 定义一个动画组
  • 将之前的动画添加到动画组中
  • 启动动画组

2、动画运行几种状态

  • 并行动画QParallelAnimationGroup
  • 串行动画QSequentialAnimationGroup

3、一个动画组的案例

import sys
from PyQt5.Qt import *


class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('动画组')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn1 = QPushButton(self)
    self.btn2 = QPushButton(self)
    self.init_ui()

  def init_ui(self):
    self.btn1.resize(50, 50)
    self.btn1.move(0, 0)
    self.btn1.setStyleSheet('QPushButton{border: none; background: pink;}')

    self.btn2.resize(50, 50)
    self.btn2.move(50, 50)
    self.btn2.setStyleSheet('border: none; background: cyan')

    # 按钮1的动画
    animation1 = QPropertyAnimation(self.btn1, b'pos', self)
    animation1.setKeyValueAt(0, QPoint(0, 0))
    animation1.setKeyValueAt(0.25, QPoint(450, 0))
    animation1.setKeyValueAt(0.5, QPoint(450, 450))
    animation1.setKeyValueAt(0.75, QPoint(0, 450))
    animation1.setKeyValueAt(1, QPoint(0, 0))
    animation1.setDuration(5000)
    # animation1.start()

    # 按钮2的动画
    animation2 = QPropertyAnimation(self.btn2, b'pos', self)
    animation2.setKeyValueAt(0, QPoint(50, 50))
    animation2.setKeyValueAt(0.25, QPoint(400, 50))
    animation2.setKeyValueAt(0.5, QPoint(400, 400))
    animation2.setKeyValueAt(0.75, QPoint(50, 400))
    animation2.setKeyValueAt(1, QPoint(50, 50))
    animation2.setDuration(3000)
    # animation2.start()

    animation_group = QSequentialAnimationGroup(self)
    animation_group.addAnimation(animation1)
    animation_group.addAnimation(animation2)
    animation_group.start()


if __name__ == "__main__":
  app = QApplication(sys.argv)
  window = Window()
  window.show()
  sys.exit(app.exec_())

五、关于QAbstractAnimation中事件的操作

1、启动动画start()

2、暂停动画pause()

3、继续启动动画resume()

4、停止动画stop()

5、基本案例

import sys
from PyQt5.Qt import *


class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('动画组')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn1 = QPushButton(self)
    self.btn2 = QPushButton(self)
    self.init_ui()

  def init_ui(self):
    self.btn1.resize(50, 50)
    self.btn1.move(0, 0)
    self.btn1.setStyleSheet('QPushButton{border: none; background: pink;}')

    self.btn2.resize(50, 50)
    self.btn2.move(50, 50)
    self.btn2.setStyleSheet('border: none; background: cyan')

    # 按钮1的动画
    animation1 = QPropertyAnimation(self.btn1, b'pos', self)
    animation1.setKeyValueAt(0, QPoint(0, 0))
    animation1.setKeyValueAt(0.25, QPoint(450, 0))
    animation1.setKeyValueAt(0.5, QPoint(450, 450))
    animation1.setKeyValueAt(0.75, QPoint(0, 450))
    animation1.setKeyValueAt(1, QPoint(0, 0))
    animation1.setDuration(5000)
    # animation1.start()

    # 按钮2的动画
    animation2 = QPropertyAnimation(self.btn2, b'pos', self)
    animation2.setKeyValueAt(0, QPoint(50, 50))
    animation2.setKeyValueAt(0.25, QPoint(400, 50))
    animation2.setKeyValueAt(0.5, QPoint(400, 400))
    animation2.setKeyValueAt(0.75, QPoint(50, 400))
    animation2.setKeyValueAt(1, QPoint(50, 50))
    animation2.setDuration(8000)
    # animation2.start()

    animation_group = QParallelAnimationGroup(self)
    animation_group.addAnimation(animation1)
    animation_group.addAnimation(animation2)
    animation_group.start()

    self.btn1.clicked.connect(animation_group.pause)
    self.btn2.clicked.connect(animation_group.resume)


if __name__ == "__main__":
  app = QApplication(sys.argv)
  window = Window()
  window.show()
  sys.exit(app.exec_())

到此这篇关于pyqt5中动画的使用详解的文章就介绍到这了,更多相关pyqt5 动画内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python使用百度API上传文件到百度网盘代码分享
Nov 08 Python
用Python的Tornado框架结合memcached页面改善博客性能
Apr 24 Python
详解Python的Django框架中的中间件
Jul 24 Python
Python脚本暴力破解栅栏密码
Oct 19 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
Dec 08 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
Python+pandas计算数据相关系数的实例
Jul 03 Python
pyqt5实现登录界面的模板
May 30 Python
python程序需要编译吗
Jun 19 Python
Python list和str互转的实现示例
Nov 16 Python
Django集成MongoDB实现过程解析
Dec 01 Python
scrapy实践之翻页爬取的实现
Jan 05 Python
django项目中新增app的2种实现方法
Apr 01 #Python
Django Admin设置应用程序及模型顺序方法详解
Apr 01 #Python
django API 中接口的互相调用实例
Apr 01 #Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
Apr 01 #Python
Python greenlet和gevent使用代码示例解析
Apr 01 #Python
Django-rest-framework中过滤器的定制实例
Apr 01 #Python
Python如何操作office实现自动化及win32com.client的运用
Apr 01 #Python
You might like
社区(php&&mysql)五
2006/10/09 PHP
php 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
基于jQuery的Tab选项框效果代码(插件)
2011/03/01 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
location.hash保存页面状态的技巧
2016/04/28 Javascript
用js动态添加html元素,以及属性的简单实例
2016/07/19 Javascript
Node.js复制文件的方法示例
2016/12/29 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
Node.js使用MySQL连接池的方法实例
2018/02/11 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
初步解析Python中的yield函数的用法
2015/04/03 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
Python时间戳使用和相互转换详解
2017/12/11 Python
python2.7到3.x迁移指南
2018/02/01 Python
使用 Python 处理 JSON 格式的数据
2019/07/22 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
如何使用python传入不确定个数参数
2020/02/18 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
详解HTML5中div和section以及article的区别
2015/07/14 HTML / CSS
会计工作决心书
2014/03/11 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
工作岗位说明书模板
2014/05/09 职场文书
乡镇安全生产目标责任书
2014/07/23 职场文书
小城镇建设汇报材料
2014/08/16 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
女性励志书籍推荐
2019/08/19 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
Python语言规范之Pylint的详细用法
2021/06/24 Python
Python OpenCV形态学运算示例详解
2022/04/07 Python