Turtle: инструмент для визуализации алгоритмов и разработки мини-игр

Раздел: Python -> Библиотеки для графики

Библиотека Turtle: основы создания графики

Как нарисовать простейшую фигуру с помощью черепашки?

Библиотека Turtle предоставляет удобный способ рисования линий, фигур и создания анимации. Основной элемент - виртуальная черепаха, которая перемещается по экрану, оставляя след. Для начала требуется импортировать модуль, создать окно и получить объект черепахи. Пример ниже рисует квадрат со стороной 100 пикселей.

import turtle

window = turtle.Screen()
window.bgcolor("lightgray")

t = turtle.Turtle()
t.color("blue")
t.pensize(3)

for _ in range(4):
    t.forward(100)
    t.right(90)

turtle.done()

Python библиотека turtle (библиотека turtle для python)

После запуска откроется окно с черепахой, которая нарисует синий квадрат. Команда turtle.done() удерживает окно открытым. Если её не вызвать, окно закрывается сразу после завершения скетча.

Типичная ошибка: Пользователи забывают turtle.done(). Также окно может не появляться в некоторых средах - нужно явно вызывать window.exitonclick().

Цель данного решения - быстро познакомиться с командами перемещения (forward, backward), поворотов (right, left) и управления пером (pensize, color). Применяется в обучении алгоритмике и создании простых иллюстраций.

Как нарисовать спираль с изменением цвета?

Изменяя длину шага и угол поворота, можно получить спираль. Добавим смену цвета с помощью цикла и списка цветов.

import turtle

t = turtle.Turtle()
t.speed(0)  # максимальная скорость
colors = ["red", "green", "blue", "orange", "purple"]
length = 10

for i in range(100):
    t.color(colors[i % len(colors)])
    t.forward(length)
    t.right(91)
    length += 1

turtle.done()
Проблема: При большом количестве итераций анимация может замедляться. Решение - установить скорость t.speed(10) или отключить анимацию t.tracer(0) и обновлять экран вручную.

Вариант используется для демонстрации циклов, динамических вычислений и работы со списками. Спирали хорошо смотрятся на экране и помогают понять принцип фракталов.

Как закрасить замкнутую область (заполнение)?

Для заливки фигуры используется команда begin_fill() и end_fill(). Пример рисует красный круг с жёлтой заливкой.

import turtle

t = turtle.Turtle()
t.pensize(2)

# жёлтый круг
c1 = turtle.Turtle()
c1.color("black", "yellow")
c1.begin_fill()
c1.circle(50)
c1.end_fill()

# красный квадрат поверх
c2 = turtle.Turtle()
c2.penup()
c2.goto(30, 0)
c2.pendown()
c2.color("blue", "red")
c2.begin_fill()
for _ in range(4):
    c2.forward(80)
    c2.right(90)
c2.end_fill()

turtle.done()
Ошибка: Если контур не замкнут, заливка не произойдёт. Убедитесь, что перед end_fill() черепаха вернулась в начальную точку или перо поднято.

Этот приём применяется для создания цветных диаграмм и графических композиций.

Как создать анимацию движения черепашки?

Можно анимировать перемещение объекта, изменяя его координаты в цикле и очищая экран. Пример - черепаха, движущаяся по синусоиде.

import turtle
import math

wn = turtle.Screen()
wn.tracer(0)  # отключаем автоматическое обновление

t = turtle.Turtle()
t.shape("turtle")
t.penup()
x = -200
t.goto(x, 0)
t.pendown()

for x in range(-200, 200, 2):
    y = 50 * math.sin(x / 30)
    t.goto(x, y)
    wn.update()  # обновляем экран

turtle.done()
Проблема: Без wn.tracer(0) анимация будет прерываться. Если точек много, стоит уменьшить шаг или увеличить задержку через time.sleep(0.01).

Такой подход используется в учебных проектах по моделированию движения, создании простых игр или визуализации математических функций.

Расширенные примеры работы с Turtle

Фрактальное дерево

Рекурсивное рисование веток с уменьшением длины и поворотом.

Пример
import turtle

def draw_branch(branch_len, t):
    if branch_len > 5:
        t.forward(branch_len)
        t.right(20)
        draw_branch(branch_len - 15, t)
        t.left(40)
        draw_branch(branch_len - 15, t)
        t.right(20)
        t.backward(branch_len)

wn = turtle.Screen()
t = turtle.Turtle()
t.speed(0)
t.left(90)
t.penup()
t.goto(0, -200)
t.pendown()
draw_branch(80, t)
wn.mainloop()
На экране появится симметричное дерево с ветвями, напоминающее настоящее.

Снежинка Коха

Фрактал на основе кривой Коха.

Пример
import turtle

def koch_curve(t, length, depth):
    if depth == 0:
        t.forward(length)
        return
    length /= 3
    koch_curve(t, length, depth - 1)
    t.left(60)
    koch_curve(t, length, depth - 1)
    t.right(120)
    koch_curve(t, length, depth - 1)
    t.left(60)
    koch_curve(t, length, depth - 1)

wn = turtle.Screen()
t = turtle.Turtle()
t.speed(0)
t.penup()
t.goto(-150, 100)
t.pendown()
for _ in range(3):
    koch_curve(t, 300, 3)
    t.right(120)
wn.mainloop()
Получается снежинка из трёх сегментов кривой Коха.

Рисование по щелчку мыши

Событийное программирование: черепаха рисует круг там, где пользователь кликнул.

Пример
import turtle

def draw_circle(x, y):
    t.penup()
    t.goto(x, y - 25)
    t.pendown()
    t.circle(25)

wn = turtle.Screen()
t = turtle.Turtle()
t.color("green")
t.pensize(2)
wn.onclick(draw_circle)
wn.mainloop()
Каждый клик левой кнопкой мыши добавляет зелёный круг.

Анимация с использованием tracer и update

Плавное движение сразу нескольких черепашек.

Пример
import turtle
import random

wn = turtle.Screen()
wn.tracer(0)

colors = ["red", "blue", "green", "orange"]
turtles = []
for i, col in enumerate(colors):
    t = turtle.Turtle()
    t.color(col)
    t.shape("circle")
    t.penup()
    t.goto(-200, i * 50 - 50)
    turtles.append(t)

for _ in range(100):
    for t in turtles:
        t.forward(random.randint(1, 5))
    wn.update()

wn.mainloop()
Четыре круга разного цвета движутся вправо с разной скоростью.

Сохранение рисунка в векторный формат (SVG)

Turtle не поддерживает экспорт напрямую, но можно использовать модуль canvasvg или сохранить скриншот. Пример - преобразование в SVG через библиотеку svgwrite.

Пример
import turtle
import svgwrite

dwg = svgwrite.Drawing('drawing.svg', profile='tiny')

# Эмуляция команд turtle и запись в SVG - сложная задача.
# Вместо этого можно сделать скриншот окна с помощью PIL.
# Для простоты показан вызов библиотеки canvasvg (если установлена):
# import canvasvg
# canvasvg.saveall('drawing.svg', turtle.getscreen().getcanvas())
Файл drawing.svg будет содержать векторное представление рисунка.

Библиотека Turtle для Python - comments

En
Python библиотека turtle (python)