python 动画场景_Python GUI教程(十五):在PyQt5中使用动画
QT作为一个全面的桌面应用程序开发包,其自然提供了对图像的动画支持。本篇文章中,就来简单地在PYQt5中使用Animation动画功能。
本篇将会依次完成以下功能:
在GUI界面中显示一个图片(用一个足球做演示);
点击按钮实现足球的直线射门动画;
点击按钮实现足球的曲线射门动画;
一、在图形界面显示图片的两种方法
一般情况下,想要在GUI中显示图片,我们会通过:
– 实例化一个QLable()部件;
– 实例化一个QPixmap()图形类;
– 通过QLabel()部件的setPixmap()方法设置QLabel()部件的图形;
就像如下代码所示:
运行上述代码,我们将会得到如下所示的图形界面:
但是这种方法没有办法实现对图片更多的控制。为了更好地对图形界面中的图片进行控制和管理,我们还需要使用到其他的类,比如QtWidgets中的QGraphicsScene类,QGraphicsScene提供了一个场景,用于对2D图形进行管理。同时,为了展示QGraphicsScene中的内容,我们还需要使用到QtWidgets中的QGraphicsView类来提供一个视图部件。
下面,我们就通过一个简单的例子来了解一下QGraphicsScene类和QGraphicsView类的使用。
首先是完整的代码,如下所示:
在这里面,基础的窗口代码与之前的代码类似,有区别且最核心的为以下几行代码。
首先,我们实例化创建了一个用于展示图形场景的图形视图QGraphicsView(),将它继承自self.main_widget主窗口部件:
然后,我们实例化创建了一个图形场景管理类QGraphicsScene(),并通过setScene()方法将图形视图self.grapview的图形场景设置为刚刚实例化创建的QGraphicsScene():
最后,我们通过QPixmap()创建并加载了一个图片,将其添加到图形项目QGraphicsPixmapItem()中,并通过addItem()方法将图形项目添加到图形场景管理self.scene中:
如此,我们就完成了通过QGraphicsView()类和QGraphicsScene()类在图形界面(GUI)中展示图片的功能,运行完整的代码,其显示出来的图形界面程序如下图所示:
二、几行代码射个门
上面我们通过两种不同的方式实现了图片在图形界面中的展示,接下来,我们借助QtCore中的QPropertyAnimation()来实现图片的动画效果。
QPropertyAnimation()类主要依靠操纵对象的QT属性来实现动画效果,其有几个比较主要的方法:
start():用于启动动画;
stop():用于停止动画;
setStartValue():用于设置动画的起始值;
setEndValue():用于设置动画的结束值;
setDuration():用于设置动画的持续时间;
setKeyValueAt():用于在特定时间创建一个关键的动画帧动作;
setLoopCount():用于设置动画的循环次数;
下面我们就使用QPropertyAnimation()类实现图片的动画。为了动画的效果比5毛特效要好一点,州的先生(公众号:zmister2016)在阿里的图标库iconfont里找了一个小足球和球门的图标,嗯,就像这样:
然后,我们创建一个图形界面,里面包含一个按钮、一个小球和一个球门的图片:
运行上述代码,我们会得到一个如下图所示的图形界面:
我们的目的是想让图形界面中的小足球通过按钮控制,进入到球门中。接下来,我们就通过QPropertyAnimation()类来实现这个效果。
在MainUi()中新建一个名为shoot()的方法,在其中写入以下代码:
最后,我们再讲按钮的点击信号绑定到shoot()方法上:
完整的代码如下所示:
运行上述代码,点击“射门”按钮,我们将会得到如下动图所示的动画:
这样,通过QPropertyAnimation()的setDuration()方法、setStartValue()方法、setEndValue()方法我们就实现了一个简单的动画。
三、圆月弯刀继续射门
但是上面的射门动画是一条直线将小足球移动到了球门之内,简单粗暴欠缺了些许美感,下面,我们让这个射门换一种方式,用圆月弯刀的香蕉球将小足球射入球门。
还记得上面我们提过QPropertyAnimation()的setKeyValueAt()这个用于设置动画关键帧的方法。现在我们就将利用它来实现足球射门时的曲线。
与上面的图形界面的代码不一样的是,我们需要绘制一条曲线线条来作为足球射门时的路径。所以我们需要对上面的图形界面的代码进行一些修改:
在上面的代码中,与之前的程序代码有一下不同之处:
我们实例化创建了一个QtGui.QPainterPath(),用于进行绘制操作。通过它的moveTo()方法,设置了绘制的起始点,通过它的cubicTo()方法,设置的绘制的整个路径:
接着,我们重写了窗口的paintEvent()方法,根据绘制操作的定义,在图形上绘制一条相应的线条:
这样,我们的图形界面程序呈现出来的就是如下图所示的样子:
图形上呈现了我们设置的足球将要运动的轨迹,接下来,我们通过QPropertyAnimation()的setKeyValueAt()设置关键帧的路径,来实现足球曲线射门,具体操作同样在shoot()方法中进行:
最后,同样将“射门”按钮的点击信号绑定在shoot()方法上。运行程序代码,点击“射门”按钮,将会出现如下动图所示的动画效果:
为了更加的美观,其实可以将重写的paintEvent()去掉,在这里为了演示路径,就没有去除。
在PyQt5中使用动画是不是很简单?有问题欢迎留言讨论。
分享到:
python 动画场景_Python GUI教程(十五):在PyQt5中使用动画相关推荐
- 用qt做python界面设计_Python GUI教程(六):使用Qt设计师进行窗口布局
本篇介绍使用qt设计师进行GUI窗口的布局管理,主要包含以下内容:使用Qt设计师布局我们的窗口部件: 垂直布局: 水平布局: 网格布局: 使用间隔: 使用"伙伴"将label标签与 ...
- python动态捕捉屏幕_python学习(十五) 屏幕抓取
15.1 屏幕抓取 15.1.1 Tidy和XHTML解析 Tidy:用来修复不规范且随意的HTML文档的工具. 为什么用XHTML: 和旧版本的HTML之间最主要的区别:HTML可能只用一个开始标签 ...
- 【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界 摄像机的实现
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由zhm ...
- 【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界:摄像机的实现...
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8657656 作者:毛星云(浅墨) ...
- 【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界:摄像机的实现
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8657656 作者:毛星云( ...
- Python之pyecharts:利用pyecharts(十五种风格)绘制2018年~2020年中国互联网Top巨头近三年市值(美元)柱状图
Python之pyecharts:利用pyecharts(十五种风格)绘制2018年~2020年中国互联网Top巨头近三年市值(美元)柱状图 目录 pyecharts(十五种风格)绘制2018年~20 ...
- [Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(二)
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 上一讲我们说了CubeMX配置SDRAM的一些基本配置,还有FMC跟SDRAM的讲解,这一讲我们 ...
- 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(一)
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 本文 1首先讲解什么是FMC及SDRAM,W9825G6KH芯片原理,2基于CubeMx创建工程 ...
最新文章
- android monitor 汉化
- python代码大全和用法用量_Python numpy.stack()用法及代码示例
- ubuntu通过xmange连接桌面
- 4G DTU使用教程
- 10.Object类
- [剑指offer][JAVA]面试题第[34]题[二叉树中和为某一值的路径][回溯]
- MinGw+Msys搭建环境 编译ffmpeg
- 说说 JavaScript 计时器的工作原理
- python simple example
- 201521123004 《Java程序设计》第2周学习总结
- 跟公司妹子交流了一下
- python文件系统监控_简单了解Python下用于监视文件系统的pyinotify包
- ENVI学习总结(四)——图像正射校正
- 基于区块链的食品安全溯源系统
- 【OD矩阵】《城市公交IC卡·数据分析方法及应用》利用公交运营时间和乘客刷卡时间特征识别上车点
- 英语口语收集(二十六)
- 计算机网络语音传输杂音回音,Win10系统中QQ语音有回音噪音该如何解决?
- iOS日常开发之frame和bounds的不同
- Manjaro的安装与配置
- Netbeans 8.0配置Python开发环境