Manim中无法对effectifs_text文本对象执行FadeOut淡出动画的问题
Manim中无法对effectifs_text文本对象执行FadeOut淡出动画的问题
嘿,我仔细看了你的代码,发现问题出在两个关键点上:
- 你执行
Transform(numbers_text.scale(0.5), effectifs_text.scale(0.5))的时候,effectifs_text其实从来没有被添加到场景中。Manim的Transform是把第一个参数(已经在舞台上的numbers_text)转换成第二个参数的形态,第二个参数只是作为模板,并不会被实际添加到场景。所以你之后试图对effectifs_text执行淡出,自然看不到效果——它根本不在舞台上。 - 另外,
scale()方法默认会返回一个新的对象,而不是修改原对象。effectifs_text.scale(0.0005)生成的是一个全新的VGroup,这个新对象同样不在场景里,所以淡出动画毫无作用。
最简单的修复方案
既然场景中实际显示的是变换后的numbers_text,直接对它执行淡出就可以了:
把原来的这行代码:
self.play(FadeOut(effectifs_text.scale(0.0005)))
改成:
self.play(FadeOut(numbers_text))
额外的小优化:修正Transform的写法
你原来的Transform写法有个小问题,numbers_text.scale(0.5)会创建一个新对象,可能导致后续对numbers_text的引用出现偏差。正确的写法应该是直接用原numbers_text作为被变换对象,目标对象用缩放后的版本:
比如步骤3里的Transform:
# 原写法 self.play(Transform(numbers_text.scale(0.5), sorted_numbers_text.scale(0.5))) # 改成这样 self.play(Transform(numbers_text, sorted_numbers_text.scale(0.5)))
步骤6里的Transform同理:
# 原写法 self.play(Transform(numbers_text.scale(0.5), effectifs_text.scale(0.5))) # 改成这样 self.play(Transform(numbers_text, effectifs_text.scale(0.5)))
这样修改后,numbers_text的引用会一直保持有效,后续的淡出动画也能正常工作。
测试修改后的代码片段
调整后步骤6到步骤7的代码应该是这样:
# Étape 6: Fusionner les nombres de chaque classe et les remplacer par leur effectif class_counts = [0] * 8 for num in sorted_numbers: # Assure que class_index est dans les limites class_index = min((num - min_val) // class_width, 7) class_counts[class_index] += 1 effectifs_text = VGroup( *[Text(f"{count}").set_color(colors[i]) for i, count in enumerate(class_counts)]) effectifs_text.arrange(RIGHT, buff=1) self.play(Transform(numbers_text, effectifs_text.scale(0.5))) self.wait(2) self.play(FadeOut(numbers_text)) print(type(effectifs_text)) # Étape 7: Construire un tableau d'effectifs pour chacune des classes de même amplitude table_data = [["Taille (cm)", "Effectif"]] for i, count in enumerate(class_counts): class_label = f"[{min_val + i * class_width}, {min_val + (i + 1) * class_width} [" table_data.append([class_label, str(count)]) table = Table( table_data, include_outer_lines=True ) # Colorier les cellules du tableau for i, row in enumerate(table_data[1:], start=1): table.add_to_back(table.get_cell( (i, 0), color=colors[(i-1) % len(colors)])) table.add_to_back(table.get_cell( (i, 1), color=colors[(i-1) % len(colors)])) self.play(FadeIn(table.scale(0.5))) self.wait(2) self.play(table.animate.shift(3*LEFT))
这样修改后,淡出动画应该就能正常触发了。
备注:内容来源于stack exchange,提问作者Jean-Pat
相关产品推荐
相关产品推荐

