PyQt5中QPropertyAnimation搭配二维数组仅最后配置动画生效问题
核心问题原因
你代码的问题本质是重复引用了同一个QPropertyAnimation实例,没有为每个动画阶段创建独立的实例:
你只为每张图片创建了1个QPropertyAnimation实例,随后将同一个实例重复赋值给了该图片对应的3个动画阶段存储位。后续给不同j阶段设置动画参数时,新参数会直接覆盖同一个实例的旧参数,最终仅最后一个阶段(j=2)的参数被保留。同时将同一个实例多次添加到动画组时,Qt动画组只会识别为同一个对象,仅执行一次,所以总执行次数从预期的9次变成了3次。
修复方案
分两步修改即可实现预期效果:
- 替换二维数组初始化逻辑,为每个图片的每个动画阶段单独创建独立的动画实例
删除原有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)
- 每次触发动画前清空动画组的旧实例,避免多次点击后动画叠加
修改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
相关产品推荐
相关产品推荐

