Глава 7 · Глубокое погружение в Turtle

speed, tracer и update

Скорость анимации и итоговая геометрия рисунка — совершенно разные вещи. А для по-настоящему сложных узоров есть приём куда мощнее, чем просто speed(0).

speed() меняет анимацию, а не результат

artist.speed() управляет тем, как быстро видно рисование — не тем, что в итоге получится. Финальный рисунок при speed(1) и при speed(0) получится геометрически абсолютно одинаковым — разница только в том, видите ли вы сам процесс или сразу готовый результат. Статичная картинка физически не может показать разницу в скорости — её видно только вживую, при запуске кода.

tracer() и update(): рисовать пакетами

Для действительно сложных рисунков (сотни и тысячи команд) даже speed(0) может ощущаться медленным — экран обновляется после каждой команды. screen.tracer(0) отключает промежуточные обновления совсем, а screen.update() обновляет экран один раз, вручную, когда рисунок готов:

ОБЫЧНЫЙ РЕЖИМ
команда → экран обновился
команда → экран обновился
команда → экран обновился
ПАКЕТНЫЙ РЕЖИМ — tracer(0)
tracer(0)
команда, команда, команда, ...
update() → экран обновился ОДИН раз
tracer_batch.py
import turtle

screen = turtle.Screen()
screen.setup(width=420, height=420)
screen.tracer(0)
artist = turtle.Turtle()
artist.hideturtle()
artist.pencolor("#5B24F9")

for i in range(36):
    artist.circle(80)
    artist.right(10)
screen.update()

screen.exitonclick()
Результат выполнения
Сложный симметричный узор из 36 наложенных друг на друга окружностей, образующих цветочный паттерн
36 окружностей, каждая повёрнута на 10° — нарисованы мгновенно благодаря tracer(0) + update()
tracer_batch_kod.py
screen.tracer(0)   # отключаем промежуточные обновления

for i in range(36):
    artist.circle(80)
    artist.right(10)

screen.update()    # один финальный апдейт — и весь узор появляется разом
Зачем это нужно
Для 10 команд разницы почти не заметно. Но для тысяч операций tracer(0) + update() может сделать рисование в разы быстрее — экран просто не тратит время на перерисовку после каждого шага.

delay() — отдельная настройка

screen.delay() задаёт задержку в миллисекундах между кадрами анимации — концептуально похоже на speed(), но работает на уровне экрана, а не отдельной черепашки:

delay_kod.py
screen.delay(15)   # миллисекунды между кадрами анимации
print(screen.delay())  # без аргумента — вернёт текущее значение

Классическая ловушка отладки

tracer(0) без update() — пустой экран
Если вызвать tracer(0) и что-то нарисовать, но забыть update() — экран останется пустым! Это одна из самых частых и неочевидных ошибок с Turtle — код выполняется без единой ошибки, а на экране ничего нет. Подробнее разберём в разделе про отладку графики.
Практика: speed, tracer и update
Модуль turtle открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Открыть практику →