Python 视频制作神器 — Manim入门篇

今天分享一篇文章,是关于如何使用 Manim 这个工具 Python 工具库来制作视频的。

据我所知,目前应该是没有专门的书籍和教程来介绍这个工具的。至于教程,不同版本的Manim有一部分文档,其中 Manim社区

文档的版本是相对完善的。

[En]

The version of the documentation is relatively perfect.

本次仅介绍 Manim 中 文本 的使用,使用的版本为 Manim Community v0.14.0,本文内容主要如下:

Python 视频制作神器 -- Manim入门篇

; 01Manim的安装与运行

安装

如何安装Manim,参见下面的官方链接:

https://docs.manim.community/en/stable/installation.html

如何运行 Manim

用 Manim 绘制图形,首先需要引入 Manim 库,然后将需要绘制的内容封装到一个 类(class) 里面。

社区版的导入代码如下:

from manim import *

对于 编辑好的程序文件( XXXX.py 文件),需要在同一个文件夹下运行命令来运行程序,命令格式如下:

manim -pql XXXX.py DemoSquare

上面的命令行中:

•manim 是社区版Manim运行程序的主要标志用语;

•p 表示程序运行后会进行预览(图片或视频);

•ql 表示低质量(quality low), 其他的选项有 -ql, -qm, -qh, -qk, 分别表示 低质量、正常质量、高质量、4K质量;

•XXXX.py 是py代码文件;

•DemoSquare 是 py代码文件中的一个类;

演示过程录屏如下:

Python 视频制作神器 -- Manim入门篇

还可以在命令行上设置许多其他参数,您可以通过支持文档的社区版本了解更多信息:

[En]

There are many other parameters that can be set on the command line, which you can learn more about through the community version of the support documentation:

https://docs.manim.community/en/stable/tutorials/configuration.html#command-line-arguments

; 02文本使用介绍

在 Manim社区版中,文本的使用可以分为几个大类,分别是:

•纯文本

•标记文本

•LaTex 文本

•代码文本

2.1 纯文本

纯文本是最常见的一类文字,在视频中使用的标题、正文等,都可以使用纯文本,在Manim 中,纯文本可以通过 Text() 对象来实现。

比如要输出 文字 “Python数据之道”,核心代码如下:

Text("Python数据之道")

效果如下:

Python 视频制作神器 -- Manim入门篇

设置文本大小

对于文本而言,设置文本在屏幕中显示的大小,是经常要做的一个事情,Text() 对象可以通过多种方法来实现:

•设置 scale 属性值;

•设置 set_width 属性值;

•设置 font_size 参数值;

python学习交流Q群:906715085###
设置文本大小
class Demo2(Scene):
    def construct(self):
        WaterMark.construct(self)
        s = "Python数据之道"
        t1 = Text(s)
        t1.to_edge(UP,buff=0.5)
        t2 = Text(s).scale(2)
        t2.next_to(t1,DOWN)
        t3 = Text(s).set_width(10)
        t3.next_to(t2,DOWN)
        t4 = Text(s,font_size=40)
        t4.next_to(t3,DOWN)
        self.add(t1)
        self.play(Write(t2))
        self.play(Create(t3))
        self.play(Write(t4))
        self.wait()

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

设置文本颜色

文本颜色设置包括指定某种颜色以及渐变颜色设置,通常情况下,颜色通过 color 参数来设置,渐变颜色通过 gradient 参数来设置。

演示案例的代码如下:

设置文本颜色
class Demo3(Scene):
    def construct(self):
        WaterMark.construct(self)
        s = "Python数据之道"
        t1 = Text(s,color=BLUE)
        t1.to_edge(UP,buff=2)
        t2 = Text("一份价值,一份收获",gradient=[BLUE,YELLOW,RED]).next_to(t1,DOWN)
        t3 = Text("Hello World",gradient=[BLUE,YELLOW,RED]).next_to(t2,DOWN)
        t4 = Text("@Python数据之道",gradient=[BLUE,YELLOW,RED],font_size=30,fill_opacity=0.8)
        t4.next_to(t3,DOWN)
        t5 = Text("Python数据之道",gradient=[BLUE,YELLOW,RED]).next_to(t4,DOWN)
        # 当英文和汉字混合时, 当前的manim社区版,使用 gradient 时会出现 bug
        self.add(t1)
        self.play(Write(t2))
        self.play(Create(t3))
        self.play(Write(t4))
        self.play(Write(t5))
        self.wait()

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

需要注意的是,当英文和汉字混合时, 当前的manim社区版,使用 gradient 时可能会出现 bug,没有渐变的效果,上述案例中的

变量 t5 实例 就没有实现渐变效果。

设置文本样式

文本样式设置,包括粗体文本、斜体文本、文本字体设置、文本透明度设置、文本换行和行距设置。

[En]

Text style settings, including bold text, italic text, text font settings, text transparency settings, text wrapping and line spacing settings.

演示案例的代码如下:

python学习交流Q群:906715085###
设置字体样式
class Demo4(Scene):
    def construct(self):
        WaterMark.construct(self)
        t1 = Text("Python数据之道",font="Alibaba PuHuiTi")
        t1.to_edge(UP,buff=0.5)
        t2 = Text("Python数据之道",color=BLUE,font="Times")
        t2.next_to(t1,DOWN)
        t3 = Text("Python数据之道", weight=BOLD)
        t3.next_to(t2,DOWN)
        t4 = Text("Python数据之道", slant=ITALIC)
        t4.next_to(t3,DOWN)
        t5 = Text("Python数据之道", fill_opacity=0.5)
        t5.next_to(t4,DOWN)
        t6 = Text("Hello\nPython", line_spacing=0.5)
        t6.next_to(t5,DOWN,buff=1).shift(LEFT)
        t7 = Text("Hello\nPython", line_spacing=2)
        t7.next_to(t6,RIGHT,buff=1)
        self.add(t1)
        self.play(Write(t2))
        self.play(Write(t3))
        self.play(Write(t4))
        self.play(Write(t5))
        self.add(t6,t7)
        self.wait()

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

主要需要做的是,当您选择字体设置时,您选择的字体需要安装在您的计算机上才能生效。

[En]

The main thing to need is that when you choose a font setting, the font you choose needs to be installed on your computer in order to be effective.

另外,对于非英文字体设置,有些风格设置可能不起作用,具体需要根据实际情况进行测试。

[En]

In addition, for non-English font settings, some style settings may not work, the specific need to test according to the actual situation.

对于咱们而言,一般就是英文和中文的使用,常用的字体加粗、斜体文字、透明度等,是有效的。对于字体,我一般是使用 “Alibaba PuHuiTi” 字体,这个字体可以免费使用。

个性化设置部分文本

在控制显示的过程中,您经常会遇到只需要显示一部分文本的情况,可以通过以下参数进行设置:

[En]

In the process of controlling display, you often encounter situations where you only need to display part of a piece of text, which can be set by the following parameters:

•t2c,全称为 “text2color”,用来设置部分文字的颜色;

•t2f,全称为 “text2font”,用来设置部分文字的字体;

•t2w,全称为 “text2weight”,用来设置部分文字加粗;

•t2s,全称为 “text2slant”,用来设置部分文字为斜体;

•t2g,全称为 “text2gradient”,用来设置部分文字的渐变颜色;

演示案例的代码如下:

个性化某些文本的样式<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>Personalize the style of some text</font>*</details>
class Demo5(Scene):
    def construct(self):
        WaterMark.construct(self)
        t1 = Text("Python数据之道",t2c={"Python":RED,'[7:9]':YELLOW})
        t1.to_edge(UP,buff=0.5)
        t2 = Text("Python数据之道",t2s={"Python":ITALIC})
        t2.next_to(t1,DOWN)
        t3 = Text("Python数据之道", t2w={"Python":BOLD})
        t3.next_to(t2,DOWN)
        t4 = Text("Python数据之道", t2f={"Python":"Times"})
        t4.next_to(t3,DOWN)
        t5 = Text(
            "Hello,PyDataLab",
            t2g={
                'PyData':[BLUE,YELLOW,RED],
                # 'offset':"1",
            },
            )
        t5.next_to(t4,DOWN)
        t6 = Text(
            "Hello,Python数据之道",
            t2g={
                'Python':[BLUE,YELLOW,RED],
            },
            )
        t6.next_to(t5,DOWN)
        t7 = Text(
            "一份价值,一份收获",
            t2g={
                '一份价值':[BLUE,YELLOW,RED],
            },
            )
        t7.next_to(t6,DOWN)
        # "t2c"、"t2s"、"t2w"、"t2g"、"t2f" 参数设置,可以直接是 字符串,或者是 字符串的位置切片
        self.add(t1)
        self.play(Write(t2))
        self.play(Write(t3))
        self.play(Write(t4))
        self.play(Write(t5))
        self.play(Write(t6))
        self.play(Write(t7))
        self.wait()

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

通过上面的代码可以看出,”t2c”、”t2s”、”t2w”、”t2g”、”t2f” 参数设置,可以直接是 字符串,或者是 字符串的位置切片。

需要注意的是,当英文和汉字混合或者全部是中文时, 当前的manim社区版,使用 t2g 对部分文字进行渐变设置 时可能会出现

bug,会出现部分文字渐变效果不完整,或者全部文字都有渐变效果。

纯文本应用案例

下面咱们来看一个用纯文本实现 “Google” 彩色 logo 的案例,如下:

class Demo6(Scene):
    def construct(self):
        WaterMark.construct(self)
        text1 = Text(
            'Google',
            t2c={'[:1]': '#3174f0', '[1:2]': '#e53125',
                 '[2:3]': '#fbb003', '[3:4]': '#3174f0',
                 '[4:5]': '#269a43', '[5:]': '#e53125'}, font_size=58).scale(3)
        self.play(Write(text1),run_time=3)
        self.wait()
        self.play(FadeOut(text1))
        t2 = Text('Google',font_size=120)
        colors = [BLUE, ORANGE, PURPLE, PINK, TEAL,DARK_BROWN, RED,LIGHT_BROWN,GOLD,BLUE_L_C,ORANGE_L_A,PURPLE_E]*10
        # for i in range(len(t2)):
        #     t2[i].set_color(colors[i])
        for letter in t2:
            letter.set_color(np.random.choice(colors,size=1))
        self.play(Write(t2),run_time=3)
        self.wait()

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

2.2 标记文本

Manim社区版使用 Pango 来渲染非 LaTex 文本。

Pango标记语言是一种类似 html 的标记语言,可以使用一系列的标记符号。

PangoMarkup is a small markup language like html and it helps you avoid using "range of characters"
 while coloring or styling a piece a Text. You can use this language with MarkupText.

标记文本的基础应用

下面是一个简单的应用程序示例:

[En]

A simple application example is as follows:

class Markup01(Scene):
    def construct(self):
        WaterMark.construct(self)
        t1 = MarkupText('Hello,  Welcome to ValueLab !"')
        t1.to_edge(UP,buff=2)
        self.add(t1)
        self.wait()

        t2 = MarkupText('一份价值, 一份 收获!"')
        t2.next_to(t1,DOWN,buff=1)
        self.add(t2)
        self.wait()

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

可以看到,对于 Markup 标记语言,在应用于英文文字的时候,应用效果是挺好的,但对于中文字体,上面的文字中,斜体效果

就没有体现出来。不知道是 Pango本身渲染的问题还是 Manim社区版存在一些瑕疵。

当前,Manim中进行文字渲染,支持以下标签:

Python 视频制作神器 -- Manim入门篇

标记文本的样式设置

标记文本的样式设置包括粗体文本、下划线、斜体、上标、下表、删行等。演示示例的代码如下:

[En]

The style settings for tagged text include bold text, underline, italic, superscript, table below, delete line, and so on. The code for the demonstration example is as follows:

样式设置、粗体、下划线、斜体等。<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>Style settings, bold, underlined, italic, etc.</font>*</details>
class Markup02(Scene):
    def construct(self):
        WaterMark.construct(self)
        text1 = MarkupText("Hello welcome to ValueLab")
        text2 = MarkupText("foo bar big small")
        text3 = MarkupText("H2O and H3O+")
        text4 = MarkupText("type help for help")
        text5 = MarkupText(
            'foo bar'
        )
        group = VGroup(text1, text2, text3, text4, text5).arrange(DOWN)
        self.add(group)

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

标记文本的颜色设置

标记文本的颜色设置主要是由于渐变设置的复杂性。请仔细查看下例中渐变设置的参数:

[En]

The color setting of the marked text is mainly due to the complexity of the gradient setting. Take a closer look at the parameters of the gradient setting in the following example:

python学习交流Q群:906715085###
颜色设置、不同的颜色、渐变等。<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>Color settings, different colors, gradients, etc.</font>*</details>
class Markup03(Scene):
    def construct(self):
        text1 = MarkupText(
            f'all in red except this', color=RED
        )
        text2 = MarkupText("nice gradient", gradient=(BLUE, GREEN))
        text3 = MarkupText(
            'nice intermediate gradient',
            gradient=(BLUE, GREEN),
        )
        text4 = MarkupText(
            'fl ligature causing trouble here'
        )
        text5 = MarkupText(
            'fl ligature defeated with offset'
        )
        text6 = MarkupText(
            'fl ligature floating inside'
        )
        text7 = MarkupText(
            'fl ligature floating inside'
        )
        group = VGroup(text1, text2, text3, text4, text5, text6, text7).arrange(DOWN)
        self.add(group)

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

文字对齐

在书写英文文字时,为了排版效果好看,经常需要将文字进行对齐显示,这个在 Manim中,也可以实现。

演示案例的代码如下:

文字对齐
class Markup05(Scene):
    def construct(self):
        WaterMark.construct(self)
        ipsum_text = (
            "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
            "Praesent feugiat metus sit amet iaculis pulvinar. Nulla posuere "
            "quam a ex aliquam, eleifend consectetur tellus viverra. Aliquam "
            "fermentum interdum justo, nec rutrum elit pretium ac. Nam quis "
            "leo pulvinar, dignissim est at, venenatis nisi. Quisque mattis "
            "dolor ut euismod hendrerit. Nullam eu ante sollicitudin, commodo "
            "risus a, vehicula odio. Nam urna tortor, aliquam a nibh eu, commodo "
            "imperdiet arcu. Donec tincidunt commodo enim a tincidunt."
        )
        justified_text = MarkupText(ipsum_text, justify=True).scale(0.4)
        not_justified_text = MarkupText(ipsum_text, justify=False).scale(0.4)
        just_title = Title("Justified")
        njust_title = Title("Not Justified")
        self.add(njust_title, not_justified_text)
        self.play(
            Transform(
                not_justified_text,
                justified_text,
            ),
            Transform(
                njust_title,
                just_title,
            ),
            run_time=2,
        )
        self.wait(1)

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

2.3 LaTex 文本

LaTeX(LATEX,音译”拉泰赫”)是一种基于ΤΕΧ的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在20世纪80年

代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由TeX所提供的强大功能,能在几天、甚至

许多书本质量的印刷品是在几个小时内生产出来的。

[En]

A lot of printed matter of book quality is produced in a few hours.

对于生成复杂的表格和数学公式尤其如此。因此,它非常适合于生成高质量的科学和数学文档。这个系统是一样的。

[En]

This is especially true for generating complex tables and mathematical formulas. Therefore, it is very suitable for generating high-quality scientific and mathematical documents. This system is the same.

适用于生成所有其他类型的文档,从简单的信件到完整的书籍。

[En]

Suitable for generating all other kinds of documents, from simple letters to complete books.

在 Manim 中使用 latex 文本,需要你的电脑环境中已经安装了 latex的相关软件和支持工具。

在 Manim 中,可以通过以下几种方法来使用 latex 文本,如下:

•Tex

•MathTex

•Title

•BulletedList

文本型的 LaTex 可以通过 Tex、Title、BulletedList 来实现,数学公式类型的文本,可以通过 Tex 或 MathTex 来实现。

基础应用

先来看一个 latex 的基础应用案例,如下:

class DemoTex01(Scene):
    def construct(self):
        WaterMark.construct(self)
        tex1 = Tex(r"\LaTeX", font_size=144)
        tex1.to_edge(UP,buff=1)
        self.add(tex1)
        self.wait()

        tex2 = Tex(r'$x^2 + y^2 = z^2$', font_size=144)
        tex2.next_to(tex1,DOWN,buff=0.5)
        tex3 = MathTex(r'x^2 + y^2 = z^2', font_size=144,color=BLUE)
        tex3.next_to(tex2,DOWN,buff=0.5)
        self.add(tex2)
        self.wait()
        self.add(tex3)
        self.wait()

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

在 Tex 或 MathTex 中使用字符串时,一般会使用 r”…” 的形式,而不是 ‘…’ 的形式,这是因为在 latex文本中,经常会涉及到一些

特殊的字符,比如 \ 。

在进行数学公式的表达时,使用 Tex 时需要在字符串前后添加符号 ,形式为 r”,形式为r “…$”,使用 MathTex 时,形式为 r”…” 就可以

是。需要注意的是,两者之间的区别。

[En]

Yes. The difference between the two needs to be noted.

使用 latex 工具包

在 latex 中输出特殊符号时,可以通过 latex 工具包来实现。

当然,需要你的电脑中已经安装了对应的 latex 工具包。对于没有使用过 latex 的同学来说,这个确实会有些繁琐。

演示案例的代码如下:

使用 latex 工具包
class DemoTex02(Scene):
    def construct(self):
        WaterMark.construct(self)
        myTemplate = TexTemplate()
        myTemplate.add_to_preamble(r"\usepackage{mathrsfs}")
        tex = Tex(r'$\mathscr{H} \rightarrow \mathbb{H}$}', tex_template=myTemplate, font_size=144)
        self.add(tex)

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

数学公式的颜色设置

在 Manim 中,对于数学公式中字符的颜色设置,可以通过参数 set_color_by_tex 和 substrings_to_isolate 的组合来实现不同的效

果。

演示案例的代码如下:

数学公式的颜色设置
class DemoTex03(Scene):
    def construct(self):
        WaterMark.construct(self)
        eq1 = MathTex(
            r"e^x = x^0 + x^1 + \frac{1}{2} x^2 + \frac{1}{6} x^3 + \cdots + \frac{1}{n!} x^n + \cdots"
        )
        eq1.scale(1.2)
        eq1.set_color_by_tex("x", YELLOW)
        eq1.to_edge(UP,buff=2)
        self.add(eq1)
        self.wait()
        # self.play(FadeOut(eq1))

        eq2 = MathTex(
            r"e^x = x^0 + x^1 + \frac{1}{2} x^2 + \frac{1}{6} x^3 + \cdots + \frac{1}{n!} x^n + \cdots",
            substrings_to_isolate="x",
        )
        eq2.scale(1.2)
        eq2.set_color_by_tex("x", RED)
        eq2.next_to(eq1,DOWN,buff=1)
        self.add(eq2)
        self.wait()

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

在 eq1 中,仅设置参数 set_color_by_tex 时,是对于包含 “x” 的整个公式进行颜色设置;而在 eq2 中,同时设置参数

set_color_by_tex 和 substrings_to_isolate 时,仅仅对公式中的 “x” 字符进行颜色设置;这两种是不一样的应用场景,大家选择合

适的去使用。

在我自己的视频中,涉及数学公式的代码部分如下:

[En]

In my own video, the part of the code that involves mathematical formulas is as follows:

class DemoTex04(Scene):
    def construct(self):
        WaterMark.construct(self)
        equations = VGroup(
            MathTex(
                r"1.01^{365} = 37.8",
                # size=80,
            ),
            MathTex(
                r"1.00^{365} = 1.00",
                # size=80,
            ),
            MathTex(
                r"0.99^{365} = 0.03",
                # size=80,
            ),
        )

        # 设置宽度
        # equations.set_width(FRAME_WIDTH-4)
        equations.set_width(8)

        for equation in equations:
            equation.set_color_by_tex_to_color_map({
                "1.01": BLUE,
                "0.99": RED,
            })

        equations.arrange(DOWN, buff=0.7, aligned_edge=LEFT)
        self.play(Write(equations[0]))
        self.wait()

        self.play(Write(equations[2]))
        self.wait()

        self.play(Write(equations[1]))
        self.wait()

        self.play(equations[1].animate.set_opacity(0.2))
        self.wait()

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

tex 模板应用

在 LaTex 中,可以通过设置使用的模板,来设置使用的字体。此外,在使用中文字符时,经常需要设置中文的模板(一般使用 ctex)。

演示案例的代码如下:

tex 模板应用
class DemoTex05(Scene):
    def construct(self):
        WaterMark.construct(self)
        tex1 = Tex(r'$x^2 + y^2 = z^2$', tex_template=TexFontTemplates.french_cursive, font_size=144)
        tex1.to_edge(UP,buff=1)
        self.add(tex1)
        self.wait()

        tex2 = Tex(r'Hello 你好 \LaTeX', tex_template=TexTemplateLibrary.ctex, font_size=144)
        tex2.next_to(tex1,DOWN,buff=0.5)
        self.add(tex2)
        self.wait()

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

对于 TexFontTemplates,可以使用的模板说明如下:

A collection of TeX templates for the fonts described at http://jf.burnol.free.fr/showcase.html

公式换行

在数学公式中,换行效果可以达到如下所示:

[En]

In the mathematical formula, the line wrapping effect can be achieved as follows:

公式换行
class DemoTex06(Scene):
    def construct(self):
        WaterMark.construct(self)
        tex1 = MathTex(
            r'f(x) &= 3 + 2 + 1\\ &= 5 + 1 \\ &= 6',
            font_size=96,
        )
        self.add(tex1)
        self.wait()
        self.play(FadeOut(tex1))

        tex2 = MathTex(
            r'f(x) &= 3 + 2 + 1\\ &= 5 + 1 \\ &= 6',
            font_size=96,
            substrings_to_isolate=['5','3'],
        )
        tex2.set_color_by_tex_to_color_map({
                "5": BLUE,
                "3": RED,
            })
        self.add(tex2)
        self.wait()

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

Title 对象应用

在视频中设置文字标题时,可以直接使用 Title 对象,需要说明的是,Title 对象是基于 Tex 来实现的,在涉及中文输出时,需要设置使用的模板为中文适用的模板。

演示案例的代码如下:

Title 对象应用
class DemoTex07(Scene):
    def construct(self):
        WaterMark.construct(self)
        title1 = Title("Hello,title")
        self.add(title1)
        self.wait()
        self.play(FadeOut(title1))

        # 使用 "Title" 对象,当有中文时,需要设置中文字体模板(电脑中需要安装了 ctex)
        title2 = Title("你好,title",tex_template=TexTemplateLibrary.ctex)
        self.add(title2)
        self.wait()

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

列表类型的文本

在文本的使用过程中,会时不时涉及到 列表型文本,目前,在 Manim 中,可以直接实现无序号型的列表文本,通过 BulletedList

对象来实现。

演示案例的代码如下:

列表类型的文本
class DemoTex08(Scene):
    def construct(self):
        blist = BulletedList("Python", "Java", "C++", height=2, width=2)
        blist.set_color_by_tex("Python", RED)
        blist.set_color_by_tex("Java", GREEN)
        blist.set_color_by_tex("C++", BLUE)
        self.add(blist)

上述代码的实施效果如下:

[En]

The implementation effect of the above code is as follows:

Python 视频制作神器 -- Manim入门篇

2.4 代码文本

在 IT编程领域,代码的高亮显示是一个常见的需求,在 Manim 制作的视频中,也可以实现代码高亮的效果,主要是通过 Code() 对象来实现。

下面以快速排序的Python代码为例,来演示如何在视频中进行代码高亮显示。

class Code1(Scene):
    def construct(self):
        WaterMark.construct(self)
        code_str_1 = """
        def quickSort(Array):
            n = len(Array)
            if n = baseline]
            return quickSort(left) + [baseline] + quickSort(right)
"""
        code1 = Code(
            code=code_str_1,
            tab_width=4,
            background="window",
            language="Python",
            font="Monospace",
            insert_line_no=False,  # 是否显示代码行数
            style='monokai',
        )

        code1.scale(0.8).to_edge(UP,buff=1)

        self.play(Write(code1))
        self.wait()

代码高亮效果如下:

Python 视频制作神器 -- Manim入门篇

上述代码中,变量 code_str_1 是快速排序算法的Python实现代码, 变量 code1 是 Code() 对象的实例, Code() 有许多参数可以

把它放好。此处仅设置了部分参数:

[En]

Set it. Only some of the parameters are set here:

•background 参数,可以选择 “rectangle” 或 “window”,默认是 “rectangle”,我自己一般喜欢用 “window”;

•language 参数是所用的编程语言,支持常用的编程语言;

•font 参数,代码字体,默认为 “Monospac821 BT”,我一般用 “Monospace”;

•insert_line_no 参数,是否显示代码行数,默认是 True;需要注意的是,在显示代码行数时,有时行数与代码的对齐效果不一定完美;

•style 参数,代码显示风格,有多种风格可以选择,其可选代码样式来源于 “pygments” (https://pygments.org/docs/styles/)。可在Python中运行代码来获取支持的样式。

from pygments.styles import get_all_styles
styles = list(get_all_styles())

style支持的样式如下:

['default', 'emacs', 'friendly', 'colorful', 'autumn', 'murphy', 'manni', 'monokai', 'perldoc', 'pastie', 'borland', 'trac', 'native', 'fruity', 'bw',

'vim', 'vs', 'tango', 'rrt', 'xcode', 'igor', 'paraiso-light', 'paraiso-dark', 'lovelace', 'algol', 'algol_nu', 'arduino', 'rainbow_dash', 'abap', 'solarized-dark',
 'solarized-light', 'sas', 'stata', 'stata-light', 'stata-dark', 'inkpot'] 默认的样式为 'vim',我一般喜欢用 'monokai' 样式。

再选择一款浅色的样式(’solarized-light’),并设置不同的参数值,来对比下效果,如下:

class Code1(Scene):
    def construct(self):
        WaterMark.construct(self)
        code_str_1 = """
        def quickSort(Array):
            n = len(Array)
            if n = baseline]
            return quickSort(left) + [baseline] + quickSort(right)
"""
        code1 = Code(
            code=code_str_1,
            tab_width=4,
            background="window",
            language="Python",
            font="Monospace",
            insert_line_no=False,  # 是否显示代码行数
            style='monokai',
        )

        code1.scale(0.8).to_edge(UP,buff=1)

        self.play(Write(code1))
        self.wait()

        code2 = Code(
            code=code_str_1,
            tab_width=4,
            background="rectangle", # rectangle , window
            language="Python",
            font="Monospace",
            insert_line_no=True,  # 是否显示代码行数
            style='solarized-light',
            # line_spacing=0.3,
        )

        code2.scale(0.8)
        code2.next_to(code1,DOWN,buff=0.5)

        self.play(Write(code2))
        self.wait()

代码高亮效果如下:

Python 视频制作神器 -- Manim入门篇

Code() 对象还有更多的参数可以进行设置,详细的参数设置说明,大家可以通过官方文档来了解。

Python 视频制作神器 -- Manim入门篇

官方文档地址:

https://docs.manim.community/en/stable/reference/manim.mobject.svg.code_mobject.Code.html

最后

文本的使用是我们最常见的领域,在使用文本时,就使用频率而言,纯文本是使用频率最高的,标记文本是纯文本的进一步扩展,而

[En]

The use of text is our most common field, when using text, in terms of frequency, plain text is the most frequently used, tagged text is a further expansion of plain text, and

latex 文本,则是 针对数学公式等特殊且频率较高的场景来使用的,至于 代码高亮,则是在IT编程特定领域进行应用。

对于涉及中文的使用,经常需要通过 latex 来实现一些效果,因此,对想进一步深入了解中文排版的同学来,可能需要有一些

latex 的基础知识。

精通文字的使用,可以给视频的排版和外观带来很多好处,不要小看这些。

[En]

Proficient in the use of text, can bring a lot of benefits to the typesetting and appearance of video, do not underestimate these.

以上就是我使用 Manim 的一些经验,希望对你有帮助。

Original: https://www.cnblogs.com/1234567FENG/p/16382642.html
Author: 蚂蚁爱Python
Title: Python 视频制作神器 — Manim入门篇

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/499345/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 9、Scrapy框架

    文章目录 1、Scrapy的结构 2、Scrapy的工作原理 3、Scrapy的用法 4、用Scrapy框架爬取豆瓣Top250图书的数据 5、用scrapy爬取招聘网站的招聘信息…

    Python 2023年10月6日
    0100
  • 数组、切片(包括字符串):“append” 方法的机制

    数组是编程语言中最常见的一个概念。数组看起来很简单但却有许多问题需要在加入编程语言中解答,比如: 固定大小还是可变大小? 大小作为类型的一部分吗? 多维数组应该是什么样子? 空数组…

    Python 2023年6月3日
    0129
  • php进销存源码云进销存管理系统

    进销存是一种管理软件,它将为公司提供一个集成的应用程序框架,运行业务的所有可能方面。实施进销存的原因是显而易见的:企业核心功能的深度结合。进销存系统可以很容易地集成,并与公司的需求…

    Python 2023年8月3日
    089
  • numpy pandas matplotlib 常用API整理

    python数据结构 python常用函数 numpy, pandas, matplotlib 整理python for ML常用的几个库,只是以表格形式给出,方便查阅,具体使用细…

    Python 2023年9月1日
    084
  • pyqt入门

    第一次接触pyqt是在20年刚毕业的时候,时隔两年,恰逢闲暇,正好回过头来对这个模块的知识进行一个整理,不会做系统化的整理,我打算可能会围绕之前做过的小工具对其涉及到的控件、信号和…

    Python 2023年10月31日
    083
  • 记录一下在jupyter notebook中使用plt.show()的注意事项

    记录一下在jupyter notebook中使用plt.show()的注意事项 在jupyter notebook中使用matplotlib画图时,发现plt.show()总是不显…

    Python 2023年9月4日
    085
  • Linux NTP工具的基本使用

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 弹尽粮绝,会员救园:…

    Python 2023年10月12日
    091
  • Python第5天–函数

    函数是被组织、可重用的代码段,用于实现单个或关联的函数,因此我经常说函数是程序员大规模使用的基础。 [En] A function is a code segment that i…

    Python 2023年5月24日
    0125
  • python-opencv-cv2.resize()函数详解

    1.cv2.resize()参数说明? cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)…

    Python 2023年8月2日
    0178
  • 累加和为 K 的最长子数组问题

    累加和为 K 的最长子数组问题 作者:Grey 原文地址: 博客园:累加和为 K 的最长子数组问题 CSDN:累加和为 K 的最长子数组问题 题目描述 给定一个整数组成的无序数组 …

    Python 2023年10月21日
    087
  • 出现 CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate‘ 的解决方法

    目录 1. 问题所示 2. 原理分析 3. 解决方法 ; 1. 问题所示 在windows启动虚拟环境的时候: conda activate labelimg 出现如下问题: B:…

    Python 2023年9月7日
    066
  • 【python】numpy使用

    1.简介: numpy支持大规模矩阵运算,同时提供大量数组运算的数学函数 特点: N维数组对象ndarray 广播功能 嵌入线性代数,傅里叶变换,随机数生成等功能函数 整合了C/C…

    Python 2023年8月25日
    0111
  • Python改写PHP刷类目映射脚本逻辑

    1、文件Auto_update_data,需要处理的映射基础数据 #定义需要导入的映射数据 #以字典进行定义 [公司类目id : 平台类目id] #d = {key1 : valu…

    Python 2023年11月2日
    0106
  • 软件设计模式白话文系列(四)工厂模式

    一、简单工厂模式 1、描述 简单工厂模式是属于创建型模式,但不属于23种 GOF 设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族…

    Python 2023年10月16日
    060
  • 几个字就能生成画作,AIGC的时代即将到来

    一、前言 最近AI绘画、聊天、代码生成可以说是刮起了一阵风,席卷了互联网。各大网站都在疯狂刷屏相关的内容,也收到了各界的热烈的关注。无论是AI绘画还是聊天这类的技术都属于同一个领域…

    Python 2023年10月24日
    080
  • 【Java8新特性】- Lambda表达式

    Java8新特性 – Lambda表达式 😄生命不息,写作不止🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 一个有梦有戏的人 @怒放吧德德🌝分享…

    Python 2023年10月20日
    0108
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球