You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5中QPropertyAnimation搭配二维数组仅最后配置动画生效问题

核心问题原因

你代码的问题本质是重复引用了同一个QPropertyAnimation实例,没有为每个动画阶段创建独立的实例:

你只为每张图片创建了1个QPropertyAnimation实例,随后将同一个实例重复赋值给了该图片对应的3个动画阶段存储位。后续给不同j阶段设置动画参数时,新参数会直接覆盖同一个实例的旧参数,最终仅最后一个阶段(j=2)的参数被保留。同时将同一个实例多次添加到动画组时,Qt动画组只会识别为同一个对象,仅执行一次,所以总执行次数从预期的9次变成了3次。

修复方案

分两步修改即可实现预期效果:

  1. 替换二维数组初始化逻辑,为每个图片的每个动画阶段单独创建独立的动画实例
    删除原有self.propAnim相关声明和二维数组赋值逻辑,替换为如下代码:
# 提前把所有图片控件存入统一列表,方便遍历
self.img_labels = [self.welcome, self.label, self.label2]
self.imageCount, self.animCount = len(self.img_labels), 3
self.animations = []

for img_idx in range(self.imageCount):
    # 每个图片单独维护一组独立的动画实例
    current_img_anims = []
    for anim_stage in range(self.animCount):
        # 每个动画阶段都新建独立的QPropertyAnimation对象
        current_img_anims.append(QPropertyAnimation(self.img_labels[img_idx], b"geometry"))
    self.animations.append(current_img_anims)
  1. 每次触发动画前清空动画组的旧实例,避免多次点击后动画叠加
    修改doAni方法,在最开头添加清空逻辑:
def doAni(self):
    # 清空已有动画,避免重复添加
    self.anim_group.clear()
    # 原有重置控件位置的逻辑保持不变
    self.label.setGeometry(0, -1080, self.pixmap.width(), self.pixmap.height())
    self.label2.setGeometry(0, -1080, self.pixmap2.width(), self.pixmap2.height())
    self.welcome.setGeometry(0, -1080, self.pixmapW.width(), self.pixmapW.height())
    
    # 后续动画参数配置、添加到动画组、启动的逻辑保持不变

内容的提问来源于stack exchange,提问作者Fatih Tüz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:06:03