from __future__ import annotations import turtle from dataclasses import dataclass, field from itertools import cycle from typing import Iterable, Sequence, Callable @dataclass(frozen=True) class PatternConfig: steps: int = 122 step_angle: float = 3.0 hop: float = 130.0 circle_radius: float = 40.0 colors: Sequence[str] = field(default_factory=lambda: ("orange", "white")) bgcolor: str = "black" speed: int = 0 pen_size: int = 1 center: tuple[float, float] = (0.0, 0.0) class PatternDrawer: def __init__(self, config: PatternConfig | None = None) -> None: self.config = config or PatternConfig() self._screen: turtle.Screen | None = None self._t: turtle.Turtle | None = None self._color_cycle: Iterable[str] = cycle(self.config.colors) def init(self) -> "PatternDrawer": screen = turtle.Screen() screen.bgcolor(self.config.bgcolor) t = turtle.Turtle(visible=False) t.speed(self.config.speed) t.pensize(self.config.pen_size) self._screen = screen self._t = t return self def run(self) -> None: