Рисование с turtle: от простых линий до сложных проектов
Основы работы с модулем turtle
Базовый подход: импорт, создание окна и черепашки
Модуль turtle входит в стандартную библиотеку Python и не требует дополнительной установки. Для начала работы достаточно импортировать его и создать объект черепашки. Самый простой способ - использовать import turtle и вызвать turtle.Turtle(). При этом автоматически открывается графическое окно.
import turtle
t = turtle.Turtle()
t.forward(100) # движение вперёд на 100 пикселей
t.right(90) # поворот направо на 90 градусов
t.forward(100)
turtle.done() # завершение работы, окно остаётся открытыммодуль черепашка python (модуль turtle (черепашка) python)
Команда turtle.done() (или turtle.mainloop()) обязательна, иначе окно закроется сразу после выполнения скрипта. Базовые методы: forward(distance), backward(distance), left(angle), right(angle). Для изменения цвета пера используется t.pencolor('red'), для заливки - t.fillcolor('blue') и пары begin_fill()/end_fill().
Типичные проблемы и их решения:
- Окно мгновенно закрывается. Решение: добавьте
turtle.done()в конце кода. - Черепашка рисует не там, где ожидается. Проверьте начальное положение (центр экрана 0,0). Используйте
t.goto(x, y)для точного перемещения. - Команды не работают после первого запуска. Убедитесь, что не происходит переопределение объекта. После
turtle.done()окно остаётся активным, но новые команды не обрабатываются; для повторного рисования запустите скрипт заново.
Как нарисовать правильный многоугольник?
Для рисования правильного многоугольника с заданным числом сторон n используется цикл: каждая сторона длины l, поворот на 360/n градусов.
import turtle
t = turtle.Turtle()
n = 6 # шестиугольник
l = 50
for _ in range(n):
t.forward(l)
t.right(360 / n)
turtle.done()Для окружности можно использовать t.circle(radius) - черепашка рисует окружность заданного радиуса, начиная снизу. Параметр extent позволяет нарисовать только часть дуги.
Возможные ошибки:
- Многоугольник искажается. Убедитесь, что угол поворота равен
360/n. Для треугольника угол 120, для квадрата 90. - Окружность рисуется медленно.
t.speed('fastest')ускоряет черепашку.
Как заставить черепашку двигаться непрерывно?
Для анимации используется цикл с изменением координат и командой t.heading(). Простейший вариант - бесконечное движение по прямой с отскоком от границ окна.
import turtle
t = turtle.Turtle()
t.speed('fastest')
dx, dy = 2, 0 # движение только по оси X
while True:
t.forward(dx)
x, y = t.position()
if abs(x) > 200: # отскок от края
t.right(180)
turtle.update() # необязательно, но улучшает анимациюОбратите внимание: для корректной работы анимации окно не должно закрываться, а цикл должен прерываться по условию. Лучше использовать turtle.tracer(0) и ручной вызов turtle.update() для контроля кадров.
Частая проблема:
- Бесконечный цикл зависает. Добавьте проверку на нажатие клавиши (например, ESC) через
turtle.onkeypress()иturtle.listen(), чтобы выйти из цикла.
Как управлять черепашкой с клавиатуры?
Модуль turtle поддерживает обработку событий клавиш. Регистрация функций обратного вызова осуществляется через turtle.onkeypress(funkcija, 'klavisha'), после чего вызывается turtle.listen() для захвата фокуса.
import turtle
t = turtle.Turtle()
t.speed('fastest')
def vpered():
t.forward(10)
def nazad():
t.backward(10)
def vlevo():
t.left(15)
def vpravo():
t.right(15)
turtle.onkeypress(vpered, 'Up')
turtle.onkeypress(nazad, 'Down')
turtle.onkeypress(vlevo, 'Left')
turtle.onkeypress(vpravo, 'Right')
turtle.listen()
turtle.done()Клавиши задаются строковыми обозначениями: 'Up', 'Down', 'Left', 'Right', 'space', 'a', 'b' и т.д. Для отслеживания отпускания используется onkeyrelease.
Ошибки:
- События не обрабатываются. Проверьте вызов
turtle.listen()и то, что окно активно (не свернуто). - Реакция на клавиши запаздывает. Установите
turtle.tracer(0)и обновляйте экран вручную.
Расширенные примеры с модулем turtle
Спираль Архимеда
Рисование спирали с увеличивающимся радиусом. Каждый шаг черепашка движется вперёд и поворачивает на небольшой угол.
import turtle
t = turtle.Turtle()
t.speed('fastest')
for i in range(100):
t.forward(i * 0.5) # постепенное увеличение длины
t.right(30)
turtle.done()На экране появится спираль, раскручивающаяся от центра.
Снежинка Коха (фрактал)
Рекурсивное построение кривой Коха. Функция koch(n, l) рисует отрезок длины l с n итерациями.
import turtle
def koch(n, l):
if n == 0:
t.forward(l)
else:
koch(n-1, l/3)
t.left(60)
koch(n-1, l/3)
t.right(120)
koch(n-1, l/3)
t.left(60)
koch(n-1, l/3)
t = turtle.Turtle()
t.speed('fastest')
t.penup()
t.goto(-200, 100)
t.pendown()
for _ in range(3):
koch(3, 400)
t.right(120)
turtle.done()Получается снежинка Коха - замкнутая фрактальная кривая с тремя выступами.
Дерево Пифагора (рекурсивное дерево)
Рекурсивное рисование дерева: каждая ветвь делится на две под углом.
import turtle
def tree(dlina):
if dlina < 10:
return
t.forward(dlina)
t.left(30)
tree(dlina * 0.7)
t.right(60)
tree(dlina * 0.7)
t.left(30)
t.backward(dlina)
t = turtle.Turtle()
t.speed('slowest')
t.left(90)
tree(100)
turtle.done()Изображается дерево с разветвлениями, утончающимися к концам.
График функции синуса
Построение графика sin(x) с переносом черепашки в нужные точки.
import turtle
import math
t = turtle.Turtle()
t.speed('fastest')
t.penup()
x0 = -300
t.goto(x0, 0)
t.pendown()
for x in range(-300, 301):
y = 50 * math.sin(math.radians(x))
t.goto(x, y)
turtle.done()На окне будет нарисован синусоидальный график с амплитудой 50.
Игра «Собери яблоко» (элементарная интерактивность)
Черепашка управляется стрелками, яблоко (ещё одна черепашка) появляется случайно. При столкновении счёт увеличивается.
import turtle
import random
# настройки
turtle.tracer(0)
okno = turtle.Screen()
okno.setup(500, 500)
# черепашка-игрок
gracz = turtle.Turtle()
gracz.shape('turtle')
gracz.speed('fastest')
# яблокo
yabloko = turtle.Turtle()
yabloko.shape('circle')
yabloko.color('red')
yabloko.penup()
yabloko.goto(random.randint(-200, 200), random.randint(-200, 200))
def w_gore():
gracz.setheading(90)
gracz.forward(10)
def w_dol():
gracz.setheading(270)
gracz.forward(10)
def w_lewo():
gracz.setheading(180)
gracz.forward(10)
def w_prawo():
gracz.setheading(0)
gracz.forward(10)
turtle.onkeypress(w_gore, 'Up')
turtle.onkeypress(w_dol, 'Down')
turtle.onkeypress(w_lewo, 'Left')
turtle.onkeypress(w_prawo, 'Right')
turtle.listen()
while True:
if gracz.distance(yabloko) < 20:
yabloko.goto(random.randint(-200, 200), random.randint(-200, 200))
turtle.update()Игрок управляет черепашкой, при касании красного круга он перемещается в новое случайное место.