Python turtle: от простых линий до фрактальных узоров

Раздел: Библиотеки -> Turtle

Python turtle: учебное пособие по библиотеке для графики

Библиотека turtle в Python позволяет создавать векторную графику с помощью виртуальной «черепашки». Она особенно полезна для обучения программированию и создания простых рисунков. Основная идея - черепашка перемещается по экрану, оставляя след, управляемый командами.

Для начала работы нужно импортировать модуль и создать объект черепашки:

import turtle
t = turtle.Turtle()

Python turtle (python turtle (черепашка))

После этого черепашка готова выполнять команды. Например, нарисовать квадрат:

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

Результат - квадрат со стороной 100 пикселей. Для завершения работы используется turtle.done().

Типичная ошибка:

Если окно с графикой закрывается сразу, добавьте turtle.exitonclick() или turtle.done() в конец программы. Без этого окно может пропасть после выполнения всех команд.

Еще одна проблема - команды не выполняются из-за того, что модуль не импортирован. Убедитесь, что в начале файла есть import turtle или from turtle import *. В некоторых средах (например, IDLE) может потребоваться отдельно установить модуль? Нет, turtle входит в стандартную библиотеку Python.

Как нарисовать окружность?

Для рисования окружности используется метод circle(r), где r - радиус.

t.circle(50)

Это нарисует окружность радиусом 50 пикселей. Можно задать угол дуги параметром extent:

t.circle(50, 180)  # полуокружность

Как залить фигуру цветом?

Для заливки используется комбинация begin_fill() и end_fill().

t.fillcolor('red')
t.begin_fill()
for _ in range(4):
    t.forward(100)
    t.right(90)
t.end_fill()

Перед началом заливки можно выбрать цвет с помощью fillcolor() или pencolor() для контура.

Ошибка: заливка не применяется, если фигура не замкнута или пропущена команда begin_fill(). Убедитесь, что все сегменты составляют замкнутый контур.

Как создать несколько черепашек одновременно?

Можно создать несколько объектов Turtle, каждый со своими координатами и направлением.

t1 = turtle.Turtle()
t2 = turtle.Turtle()
t1.forward(100)
t2.left(90)
t2.forward(100)

Каждая черепашка рисует независимо. Для управления их движением параллельно используйте цикл с проверкой.

Цель: рисование сложных узоров или анимация.

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

Библиотека работает в однопоточном режиме, но анимацию можно создать с помощью turtle.tracer(0) и turtle.update().

turtle.tracer(0)
for i in range(360):
    t.forward(1)
    t.right(1)
    turtle.update()
turtle.done()

Это нарисует спираль, обновляя экран на каждом шаге. Без tracer(0) анимация была бы очень быстрой и не заметной.

Как реагировать на нажатия клавиш?

Используются методы onkey() и listen().

def move_forward():
    t.forward(10)

turtle.onkey(move_forward, 'space')
turtle.listen()
turtle.done()

При нажатии на пробел черепашка продвинется на 10 пикселей. Для клавиш со стрелками используйте 'Up', 'Down' и т.д.

Важно: окно должно быть в фокусе, иначе события не обрабатываются. Также убедитесь, что listen() вызывается после всех назначений.

Как изменить форму черепашки?

Метод shape() позволяет выбрать форму из набора: 'turtle', 'circle', 'square', 'triangle', 'classic', 'arrow'.

t.shape('turtle')

Также можно создать пользовательскую форму через register_shape().

Общие проблемы и их решения:

  • Окно не появляется: в некоторых средах (например, PyCharm) нужно добавить turtle.done() или turtle.mainloop().
  • Черепашка не двигается: проверьте, что она не поднята (penup()).
  • Графика зависает: используйте turtle.tracer(0) и периодический update().
  • Импорт не найден: turtle - стандартный модуль, переустановите Python или проверьте, что файл не называется turtle.py.

Расширенные примеры с turtle

Ниже приведены нестандартные примеры, демонстрирующие возможности turtle.

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

Пример
import turtle

t = turtle.Turtle()
t.speed(0)
t.left(90)
t.penup()
t.backward(200)
t.pendown()

def tree(branch_len):
    if branch_len < 10:
        return
    t.forward(branch_len)
    t.left(30)
    tree(branch_len * 0.7)
    t.right(60)
    tree(branch_len * 0.7)
    t.left(30)
    t.backward(branch_len)

tree(100)
turtle.done()

Результат:

На экране появляется рекурсивное дерево с тонкими ветвями, уменьшающимися с каждым уровнем.

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

Пример
import turtle

t = turtle.Turtle()
t.speed(0)
t.penup()
t.goto(-150, 100)
t.pendown()

def koch(length, n):
    if n == 0:
        t.forward(length)
    else:
        koch(length/3, n-1)
        t.left(60)
        koch(length/3, n-1)
        t.right(120)
        koch(length/3, n-1)
        t.left(60)
        koch(length/3, n-1)

for _ in range(3):
    koch(300, 3)
    t.right(120)
turtle.done()

Результат:

Фрактальная снежинка из трёх кривых Коха. Уровень рекурсии можно увеличить (например, 4) для более детализированного узора.

Игра «Догонялки» с двумя черепашками

Пример
import turtle
import random

screen = turtle.Screen()
screen.bgcolor('lightblue')
screen.tracer(0)

player = turtle.Turtle()
player.shape('triangle')
player.color('blue')
player.penup()

enemy = turtle.Turtle()
enemy.shape('circle')
enemy.color('red')
enemy.penup()

def move_player(x, y):
    player.goto(x, y)

screen.onclick(move_player)

while True:
    enemy.goto(random.randint(-200,200), random.randint(-200,200))
    screen.update()
    # Задержка для анимации
    import time
    time.sleep(0.5)

Результат:

При клике мышкой синяя черепашка перемещается в точку клика, красная случайным образом прыгает. Это прототип игры на реакцию.

Рисование спирали Фибоначчи

Пример
import turtle

t = turtle.Turtle()
t.speed(0)

a, b = 0, 1
for i in range(10):
    t.circle(b * 5, 90)
    a, b = b, a + b
turtle.done()

Результат:

Спираль, построенная на числах Фибоначчи. Каждая дуга - четверть окружности с радиусом, равным следующему числу Фибоначчи.

Управление несколькими черепашками с клавиатуры

Пример
import turtle

screen = turtle.Screen()

t1 = turtle.Turtle()
t1.color('red')
t2 = turtle.Turtle()
t2.color('blue')

def move_t1_up():
    t1.setheading(90)
    t1.forward(10)

def move_t1_down():
    t1.setheading(270)
    t1.forward(10)

def move_t2_left():
    t2.setheading(180)
    t2.forward(10)

def move_t2_right():
    t2.setheading(0)
    t2.forward(10)

screen.onkey(move_t1_up, 'w')
screen.onkey(move_t1_down, 's')
screen.onkey(move_t2_left, 'a')
screen.onkey(move_t2_right, 'd')

screen.listen()
screen.mainloop()

Результат:

Две черепашки управляются разными клавишами: W/S - красная вверх/вниз, A/D - синяя влево/вправо.

Python turtle (черепашка) - comments

En
Python turtle (python)