Skip to content

Widgets

code_video.PartialCode

Renders source code files or strings in part, delineated by line numbers

__init__(self, path=None, code=None, extension='py', **kwargs) special

Parameters:

Name Type Description Default
path Optional[str]

The source code file path. Either this or code must be set

None
code Optional[List[str]]

A list of code lines as strings. Either this or path must be set

None
extension str

The code extension, required if using code

'py'
Source code in code_video/code_walkthrough.py
def __init__(self, path: Optional[str] = None, code: Optional[List[str]] = None, extension: str = "py", **kwargs):
    """
    Args:
        path: The source code file path. Either this or `code` must be set
        code: A list of code lines as strings. Either this or `path` must be set
        extension: The code extension, required if using `code`
    """

    if not code and not path:
        raise ValueError("Must define file_name or code")

    if code and not extension:
        raise ValueError("Must define the extension with the code")

    if not extension:
        extension = path.split(".")[-1]

    if path:
        with open(path, "r") as f:
            code = f.readlines()

    with NamedTemporaryFile(suffix=f".{extension}") as f:
        f.writelines([line.encode() for line in code])
        f.flush()
        super().__init__(f.name, **kwargs)

code_video.TextBox

A text with a box around it

__init__(self, text, **kwargs) special

Parameters:

Name Type Description Default
text str

The text to display

required
Source code in code_video/widgets.py
def __init__(self, text: str, **kwargs):
    """
    Args:
        text: The text to display
    """
    super().__init__(text, **kwargs)
    self._box(
        text=text,
        border_builder=lambda title: Rectangle(
            height=_get_text_height(title) + self.border_padding, width=title.get_width() + self.border_padding
        ),
    )

code_video.NoteBox

Text with a note box around it

__init__(self, text, **kwargs) special

Parameters:

Name Type Description Default
text str

The text to display

required
Source code in code_video/widgets.py
def __init__(self, text: str, **kwargs):
    """
    Args:
        text: The text to display
    """
    super().__init__(text, **kwargs)

    def build_border(title: Text):
        ear_size = title.get_width() * 0.05
        w = title.get_width() + 0.3 * 2
        h = title.get_height() + 0.3
        return Polygon((0, h, 0), (w - ear_size, h, 0), (w, h - ear_size, 0), (w, 0, 0), (0, 0, 0), (0, h, 0))

    self._box(text=text, border_builder=build_border)

code_video.Connection

An arrow connection between two objects

__init__(self, source, target, label=None, **kwargs) special

Parameters:

Name Type Description Default
source Mobject

The source object

required
target Mobject

The target object

required
label Optional[str]

The optional label text to put over the arrow

None
Source code in code_video/widgets.py
def __init__(self, source: Mobject, target: Mobject, label: Optional[str] = None, **kwargs):
    """
    Args:
        source: The source object
        target: The target object
        label: The optional label text to put over the arrow
    """
    super().__init__(**kwargs)
    label_direction = UP
    label_buff = 0

    arrow: Optional[Arrow] = None
    if source.get_x(RIGHT) <= target.get_x(LEFT):
        arrow = Arrow(start=source.get_edge_center(RIGHT), end=target.get_edge_center(LEFT), buff=0)
        label_direction = UP
    elif source.get_x(LEFT) >= target.get_x(RIGHT):
        arrow = Arrow(start=source.get_edge_center(LEFT), end=target.get_edge_center(RIGHT), buff=0)
        label_direction = UP
    elif source.get_y(DOWN) >= target.get_y(UP):
        arrow = Arrow(start=source.get_edge_center(DOWN), end=target.get_edge_center(UP), buff=0)
        label_direction = RIGHT
        label_buff = VERTICAL_ARROW_LABEL_BUFF
    elif source.get_y(UP) <= target.get_y(DOWN):
        arrow = Arrow(start=source.get_edge_center(UP), end=target.get_edge_center(DOWN), buff=0)
        label_direction = RIGHT
        label_buff = VERTICAL_ARROW_LABEL_BUFF

    if not arrow:
        raise ValueError("Unable to connect")

    self.add(arrow)
    if label:
        text = Text(label, font=self.font, size=0.7, slant=ITALIC)
        text.next_to(arrow, direction=label_direction, buff=label_buff)
        self.add(text)