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 实现链表实例代码
Apr 07 Python
利用Python循环(包括while&for)各种打印九九乘法表的实例
Nov 06 Python
Python对数据进行插值和下采样的方法
Jul 03 Python
小白入门篇使用Python搭建点击率预估模型
Oct 12 Python
python3学生名片管理v2.0版
Nov 29 Python
Python对HTML转义字符进行反转义的实现方法
Apr 28 Python
Python环境Pillow( PIL )图像处理工具使用解析
Sep 12 Python
python+selenium+Chrome options参数的使用
Mar 18 Python
Python连接Impala实现步骤解析
Aug 04 Python
Pycharm 2020.1 版配置优化的详细教程
Aug 07 Python
python zip()函数的使用示例
Sep 23 Python
图神经网络GNN算法
May 11 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_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
php从字符串创建函数的方法
2015/03/16 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
php接口隔离原则实例分析
2019/11/11 PHP
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
异步加载script的代码
2011/01/12 Javascript
web基于浏览器的本地存储方法应用
2012/11/27 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
jquery实现数字输入框
2017/02/22 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
ligerUI的ligerDialog关闭刷新的方法
2019/09/27 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
2021/02/08 Javascript
在Ubuntu系统下安装使用Python的GUI工具wxPython
2016/02/18 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
对Python3 goto 语句的使用方法详解
2019/02/16 Python
django框架auth模块用法实例详解
2019/12/10 Python
Windows系统下pycharm中的pip换源
2020/02/23 Python
python新手学习使用库
2020/06/11 Python
详解CSS3中使用gradient实现渐变效果的方法
2015/08/18 HTML / CSS
美国内衣第一品牌:Hanes(恒适)
2016/07/29 全球购物
柯基袜:Corgi Socks
2017/01/26 全球购物
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
Ibatis如何使用动态表名
2015/07/12 面试题
车间副主任岗位职责
2013/12/24 职场文书
投标承诺函格式
2015/01/21 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书