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

如何在Manim中实现代码逐行高亮并分栏展示对应操作?

如何在Manim中实现代码逐行高亮并分栏展示对应操作?

嘿,我来帮你搞定这个问题!你遇到的矩形乱跑的情况,主要是因为直接遍历code.code创建的矩形没有和代码组件的位置关联起来,而且没做好分栏布局。下面我给你一步步拆解解决方案:

首先,咱们先理清核心问题:Code组件本身是一个包含背景、代码文本、行号的VGroup,你直接遍历code.code里的行文本创建矩形时,这些矩形的坐标是基于全局场景的,没有和代码组件的位置绑定,所以才会乱跑。另外分栏展示需要把代码和操作说明分别定位到左右两侧。

完整实现示例代码

我给你写了一个可直接运行的示例,你可以根据自己的需求调整参数:

from manim import *

class CodeHighlightScene(Scene):
    def construct(self):
        # 1. 创建代码组件并调整基础样式
        code = Code(
            "queueDS.py",  # 你的代码文件路径
            language="python",
            insert_line_no=True,
            background="window",
            style="monokai",
            fill_color=BLUE,
            line_spacing=0.8,  # 缩小行间距让高亮矩形更贴合
            font_size=20       # 根据场景大小调整字体
        )

        # 2. 为每行代码创建高亮矩形
        highlight_rects = VGroup()
        for line in code.code:
            rect = SurroundingRectangle(
                line,
                color=YELLOW,       # 矩形边框颜色
                fill_color=YELLOW,   # 填充色
                fill_opacity=0.3,    # 填充透明度,避免遮挡代码
                buff=0.1            # 矩形和文本的间距,调小更紧凑
            )
            highlight_rects.add(rect)

        # 把代码和高亮矩形绑定成一个组,确保位置同步
        code_group = VGroup(code, highlight_rects)

        # 3. 创建右侧的操作说明文本(替换成你自己的步骤)
        action_texts = VGroup(
            Text("初始化队列数据结构", font_size=20),
            Text("执行入队操作:添加元素到队尾", font_size=20),
            Text("执行出队操作:移除队首元素", font_size=20),
            Text("查看当前队首元素的值", font_size=20)
        )
        # 垂直排列操作文本,左对齐
        action_texts.arrange(DOWN, aligned_edge=LEFT, buff=0.8)

        # 4. 分栏布局:把代码组和操作文本左右排列
        full_layout = VGroup(code_group, action_texts).arrange(RIGHT, buff=2)
        self.add(full_layout)

        # 5. 逐行高亮+同步操作说明的动画
        for idx in range(len(code.code)):
            # 高亮当前代码行
            self.play(FadeIn(highlight_rects[idx], run_time=0.5))
            # 如果有对应操作说明,同步高亮文本
            if idx < len(action_texts):
                self.play(action_texts[idx].animate.set_color(GREEN), run_time=0.5)
            # 停留一段时间方便观看
            self.wait(1)
            # 取消高亮(可选,根据需求保留)
            self.play(FadeOut(highlight_rects[idx], run_time=0.5))
            if idx < len(action_texts):
                self.play(action_texts[idx].animate.set_color(WHITE), run_time=0.5)

关键细节解释

  • 解决矩形乱跑问题:我把代码和所有高亮矩形放到同一个VGroup里,这样不管怎么调整代码组的位置,矩形都会跟着代码走,不会出现偏移。
  • 分栏布局:用arrange(RIGHT, buff=2)让代码组和操作文本自动左右排列,buff参数控制两栏之间的间距,你可以根据需要调整。
  • 逐行动画逻辑:通过循环遍历每行代码,用FadeIn/FadeOut控制高亮矩形的显示隐藏,同时同步改变对应操作文本的颜色,实现“代码高亮+操作说明对应”的效果。

一些实用调优建议

  • 如果你的代码行数比操作步骤多,可以在循环里加判断,比如超出操作文本数量的代码行只高亮,不处理操作文本。
  • 可以调整SurroundingRectangle的fill_opacity、color、buff参数,让高亮效果更符合你的审美。
  • 如果代码行间距太大,矩形会显得过于宽松,调整Code的line_spacing参数即可。
  • 确保queueDS.py和你的Manim场景文件在同一目录,或者使用绝对路径指定文件位置。

备注:内容来源于stack exchange,提问作者Imtiaz Nabi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:19:36