PySide(PyQt)的QPropertyAnimation(属性动画)的应用实践

server/2024/9/24 13:59:17/

关于QPropertyAnimation的基础知识见PySide(PyQt)的QPropertyAnimation(属性动画)-CSDN博客

原理和语句都很简单。然而在实践使用中 ,还是踩了坑,耗了一下午的时间才解决。

看代码:

from PyQt5.QtCore import QPropertyAnimation, QSize, QEasingCurve
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QLabelapp = QApplication([])# 创建一个窗口
window = QWidget()
window.setGeometry(100, 100, 800, 300)
layout = QVBoxLayout(window)# 创建一个标签
label = QLabel("Animate Me")
label.setStyleSheet('border:2px solid #b6b6b6;background-color:#e0e0e0;')
label.setFixedHeight(40)  # 固定按钮的高度
layout.addWidget(label)# 创建 QPropertyAnimation 对象
animation = QPropertyAnimation(label, b"size")# 设置动画的起始值和结束值
start_size = label.size()
end_size = QSize(300, label.height())  # 目标宽度为300,高度保持不变
animation.setStartValue(start_size)
animation.setEndValue(end_size)# 设置动画持续时间(2000 毫秒即 2 秒)
animation.setDuration(2000)# 设置缓动曲线为线性
animation.setEasingCurve(QEasingCurve.Linear)# 启动动画
animation.start()window.show()
app.exec_()

这个代码的运行是没有任何问题的。将其稍加修改:

from PyQt5.QtCore import QPropertyAnimation, QSize, QEasingCurve
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QLabelapp = QApplication([])# 创建一个窗口
window = QWidget()
window.setGeometry(100, 100, 800, 300)
layout = QVBoxLayout(window)# 创建一个标签
label = QLabel("Animate Me")
label.setStyleSheet('border:2px solid #b6b6b6;background-color:#e0e0e0;')
label.setFixedHeight(40)  # 固定按钮的高度
layout.addWidget(label)def animate():# 创建 QPropertyAnimation 对象animation = QPropertyAnimation(label, b"size")# 设置动画的起始值和结束值start_size = label.size()end_size = QSize(300, label.height())  # 目标宽度为300,高度保持不变animation.setStartValue(start_size)animation.setEndValue(end_size)# 设置动画持续时间(2000 毫秒即 2 秒)animation.setDuration(2000)# 设置缓动曲线为线性animation.setEasingCurve(QEasingCurve.Linear)# 启动动画animation.start()animate()
window.show()
app.exec_()

        新的代码中,将动画部分的定义和设置、运行定义为一个函数animate(),并在主循环中运行。从逻辑和语法上看没有任何问题,但是,运行的结果,并没有执行预期的动画。

        究其原因, 新的代码中,QPropertyAnimation 对象animation,它是函数animate()的一个局部变量,当函数animate()执行完毕后,并没有将该变量传递到主线程,所以造成运行异常。解决方法是将QPropertyAnimation 对象定义为一个全局变量,即可保证在局部函数运行后,QPropertyAnimation 对象仍然持续运行。修改后的代码:

from PyQt5.QtCore import QPropertyAnimation, QSize, QEasingCurve
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QLabelapp = QApplication([])# 创建一个窗口
window = QWidget()
window.setGeometry(100, 100, 800, 300)
layout = QVBoxLayout(window)# 创建一个标签
label = QLabel("Animate Me")
label.setStyleSheet('border:2px solid #b6b6b6;background-color:#e0e0e0;')
label.setFixedHeight(40)  # 固定按钮的高度
layout.addWidget(label)# 创建全局变量的QPropertyAnimation 对象
animation = QPropertyAnimation(label, b"size")def animate():# 创建 QPropertyAnimation 对象# animation = QPropertyAnimation(label, b"size")# 设置动画的起始值和结束值start_size = label.size()end_size = QSize(300, label.height())  # 目标宽度为300,高度保持不变animation.setStartValue(start_size)animation.setEndValue(end_size)# 设置动画持续时间(2000 毫秒即 2 秒)animation.setDuration(2000)# 设置缓动曲线为线性animation.setEasingCurve(QEasingCurve.Linear)# 启动动画animation.start()animate()
window.show()
app.exec_()

或者:

from PyQt5.QtCore import QPropertyAnimation, QSize, QEasingCurve, QObject
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QLabelapp = QApplication([])# 项目的定义
class UI(QObject):  # 将项目定义为QObject,用来管理项目级别的信号和变量def __init__(self):super().__init__()# 窗口的定义
class Window(QWidget):def __init__(self, parent=None):super().__init__(parent)self.setupUI()def setupUI(self):self.setGeometry(100, 100, 800, 300)self.layout = QVBoxLayout(self)# 创建一个标签self.label = QLabel("Animate Me")self.label.setStyleSheet('border:2px solid #b6b6b6;background-color:#e0e0e0;')self.label.setFixedHeight(40)  # 固定按钮的高度self.layout.addWidget(self.label)# UI类的实体化
ui = UI()
# 窗口的实体化
window = Window()# 创建全局变量的QPropertyAnimation 对象
ui.animation = QPropertyAnimation(window.label, b"size")def animate(obj):# 创建 QPropertyAnimation 对象# animation = QPropertyAnimation(label, b"size")# 设置动画的起始值和结束值start_size = obj.size()end_size = QSize(300, obj.height())  # 目标宽度为300,高度保持不变ui.animation.setStartValue(start_size)ui.animation.setEndValue(end_size)# 设置动画持续时间(2000 毫秒即 2 秒)ui.animation.setDuration(2000)# 设置缓动曲线为线性ui.animation.setEasingCurve(QEasingCurve.Linear)# 启动动画ui.animation.start()animate(window.label)
window.show()
app.exec_()

 这个代码中,定义了一个UI(QObject)的类,将其作为项目级别的信号和变量的容器。以“ui.”开头的变量都是项目级别的、跨画面的,其生命周期属于主线程。

进一步的应用demo,见PySide(PyQt)使用QPropertyAnimation制作动态界面-CSDN博客


http://www.ppmy.cn/server/90357.html

相关文章

PHP安全编程宝典:30000字精细解析

文章目录 基础语法单双引号的区别前后端分离数据类型PHP常量函数var_dump函数count函数print_r函数**readfile()函数****file_get_contents()函数****file_put_contents()函数**header函数fopen函数fread 函数rename函数copy()函数…

SciPy 与 MATLAB 数组

SciPy 与 MATLAB 数组 SciPy 是一个开源的 Python 库,广泛用于科学和工程计算。它构建在 NumPy 数组的基础之上,提供了许多高级科学计算功能。MATLAB 是一个高性能的数值计算环境,它也使用数组作为其基础数据结构。在这篇文章中,我们将探讨 SciPy 和 MATLAB 在数组操作上的…

DataEase一键部署:轻松搭建数据可视化平台

DataEase是一个开源的数据可视化和分析工具,旨在帮助用户轻松创建和共享数据仪表盘。它支持多种数据源,包括关系型数据库,文件数据源,NoSQL数据库等,提供强大的数据查询、处理和可视化功能。DataEase 不仅是一款数据可…

Redis实操步骤以及命名细节

1.Redis实现步骤 在 Java 中操作 Redis 通常涉及使用 Redis 客户端库,例如 Jedis 或 Spring Data Redis。下面是一个基于 Spring Data Redis 的实现步骤,包括环境配置、连接 Redis、基本操作等。 步骤 1: 添加依赖 如果你使用 Maven,可以在 p…

一款允许使用Docker部署本地托管的、基于 Web 的 PDF 操作工具

大家好,今天给大家分享的是一个基于Spring Boot开发的开源项目,旨在提供一个功能强大的基于Docker的本地托管PDF操作工具Stirling PDF。 项目介绍 Stirling-PDF是一个全面的PDF工具箱,适用于个人和企业用户,尤其对于那些重视数据…

服务器数据恢复—raid信息丢失导致RAID无法被识别的数据恢复案例

服务器数据恢复环境&故障: 某单位机房搬迁,将所有服务器和存储搬迁到新机房并重新连接线路,启动所有机器发现其中有一台服务器无法识别RAID,提示未做初始化操作。 发生故障的这台服务器安装LINUX操作系统,配置了NF…

[极客大挑战 2019]PHP1

打开靶机 提示有备份,可以用工具扫描,我还没有配置好环境,搜了一下其他师傅的:备份的地址在这: /www.zip 下载后得到这几个文件: index.php就是上面打开的网页,其中有一段php代码:…

我在高职教STM32——串口通信(5)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 CSDN 平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思的教学设计分享…