Коротко: черепашка (turtle) входить у стандартний Python, окремо її ставити не треба. Ти пишеш t.forward(100) і t.left(90), а черепашка повзе по вікну й лишає лінію. Нижче шпаргалка команд і 10 малюнків від квадрата до нічного міста. Кожен код ми запустили, і біля кожного написано, що вийде і що зміниться, якщо поміняти одне число.

Більшість фігур тримається на одному правилі, і ти побачиш його майже в кожному прикладі: щоб замкнути фігуру з n однаковими сторонами, черепашка має сумарно повернутися на 360°. Звідси 90 для квадрата, 120 для трикутника, 60 для шестикутника.

Шпаргалка команд turtle

Усі приклади починаються з import turtle і t = turtle.Turtle(). Далі t і є твоя черепашка, команди їй пишуться через крапку.

КомандаЩо робить
t.forward(100)вперед на 100 пікселів з лінією; t.backward(100) назад
t.left(90), t.right(90)поворот на місці ліворуч або праворуч на 90°
t.penup(), t.pendown()підняти перо (ходити без сліду) і опустити
t.goto(x, y)перейти в точку; центр вікна — (0, 0)
t.color("red", "yellow")колір лінії і заливки; один колір іде на обидва
t.begin_fill() … t.end_fill()зафарбувати фігуру, намальовану між ними
t.circle(50)коло радіусом 50; t.circle(50, 90) лише чверть кола
t.speed(0)швидкість: 1 повільно, 10 швидко, 0 найшвидше
t.width(3)товщина лінії
t.dot(10)крапка діаметром 10
turtle.bgcolor("black")колір фону
turtle.done()останній рядок, тримає вікно відкритим

x росте праворуч, y угору. На старті черепашка в центрі й дивиться праворуч. Кольори — англійські назви ("orange", "skyblue") або коди на зразок "#0057B7".

Як запустити і чому вікно одразу зникає

Найпростіше запускати в IDLE: він уже є у тебе, якщо Python ставили з python.org. File → New File, вставити код, зберегти, F5. У VS Code те саме робить кнопка ▶ угорі праворуч (потрібне розширення Python). Python у тебе ще не стоїть? Ось встановлення на Windows.

Без turtle.done() у кінці програма завершиться і забере вікно з собою: з VS Code чи терміналу малюнок блимне на частку секунди. done() тримає вікно, поки ти не закриєш його сам. В IDLE вікно іноді лишається й так, бо IDLE не вимикає Python після запуску. Але звичка одна: done() завжди останнім рядком.

Ще дві пастки першого дня:

  • Твій файл називається turtle.py. Тоді import turtle підтягує твій же файл, і Python пише AttributeError: partially initialized module 'turtle' has no attribute 'Turtle'. Перейменуй файл, скажімо, на malyunok.py.
  • ModuleNotFoundError: No module named 'tkinter'. Черепашка малює через tkinter, а в тебе його не поставили. На Windows перевстанови Python з галочкою «tcl/tk and IDLE», на Linux додай пакет python3-tk.

10 малюнків: від квадрата до нічного міста

Кожен приклад — окрема програма. Копіюй увесь код, від import до done(): без першого рядка Python не знатиме, що таке turtle.

1. Квадрат

import turtle

t = turtle.Turtle()
t.shape("turtle")
t.width(3)

for _ in range(4):
    t.forward(100)   # сторона — 100 кроків
    t.left(90)       # 360 / 4 = 90

turtle.done()

Що вийде: чорний квадрат 100 × 100, лівий нижній кут у центрі вікна, лінія товщиною 3. Після четвертого повороту черепашка там, звідки почала, і знову дивиться праворуч.

Зміни одне число: 90 на 120. Вийде трикутник, а четверта сторона ляже поверх першої. Як range(4) рахує повтори, тобі розкаже стаття про цикл for.

2. П'ятикутна зірка

import turtle

t = turtle.Turtle()
t.width(3)
t.color("orange")

for _ in range(5):
    t.forward(150)
    t.right(144)     # 5 × 144 = 720 — два повні оберти

turtle.done()

Що вийде: помаранчева зірка, кожна лінія 150 пікселів. Чому 144? За п'ять поворотів черепашка обходить коло двічі: 5 × 144 = 720. Тому лінії й перетинаються.

Тут два числа разом: 144 на 170 і 5 на 36. Вийде спалах із 36 гострих променів, і він теж замкнеться: 36 × 170 = 6120, рівно 17 обертів. Для семикутної зірки тобі знадобиться range(7) і кут 180 - 180 / 7.

3. Квадратна спіраль

import turtle

t = turtle.Turtle()
t.speed(0)           # 0 — найшвидше
t.color("teal")

size = 5
for _ in range(50):
    t.forward(size)
    t.left(91)       # на 1 градус більше, ніж у квадрата
    size += 3        # кожна наступна сторона довша на 3

turtle.done()

Що вийде: бірюзова спіраль з 50 відрізків, від 5 до 152 пікселів, загалом близько 210 × 210. Зайвий градус зсуває кожен виток, і спіраль закручується вихором.

Зміни одне число: з 90 у тебе вийде рівний квадратний «лабіринт» без закрутки, з 121 — закручена трикутна спіраль.

4. Візерунок: цикл у циклі

import turtle

t = turtle.Turtle()
t.speed(0)
t.color("purple")

for _ in range(12):        # 12 квадратів
    for _ in range(4):     # один квадрат
        t.forward(80)
        t.left(90)
    t.left(30)             # 360 / 12 = 30

turtle.done()

Що вийде: фіолетова розетка з 12 квадратів 80 × 80 зі спільною вершиною в центрі, близько 220 × 220. Внутрішній цикл малює квадрат, зовнішній повторює його 12 разів: 48 ліній з восьми рядків.

Зміни одне число: 30 на 20. Квадрати покриють лише 12 × 20 = 240° із 360, і збоку з'явиться порожній сектор.

5. Будиночки з функціями

import turtle

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

def go(x, y):              # перейти, не залишаючи сліду
    t.penup()
    t.goto(x, y)
    t.pendown()

def square(size, color):
    t.color("black", color)
    t.begin_fill()
    for _ in range(4):
        t.forward(size)
        t.left(90)
    t.end_fill()

def triangle(size, color):
    t.color("black", color)
    t.begin_fill()
    for _ in range(3):
        t.forward(size)
        t.left(120)
    t.end_fill()

def house(x, y, size):     # (x, y) — лівий нижній кут
    go(x, y)
    square(size, "tan")            # стіни
    go(x, y + size)
    triangle(size, "firebrick")    # дах

house(-200, -50, 80)
house(-60, -50, 110)
house(100, -50, 70)

turtle.done()

Що вийде: три будиночки з пісочними стінами і цегляно-червоними дахами, розміром 80, 110 і 70. Ти пишеш функцію house() один раз і викликаєш тричі. Навіщо параметри x, y, size, пояснює довідник з функцій.

Зміни одне число: у house(-60, -50, 110) 110 на 160. Середній будинок стане впритул до правого сусіда, а дах підлаштується сам, бо трикутник бере той самий size.

6. Сонце з променями

import turtle

t = turtle.Turtle()
t.speed(0)
turtle.bgcolor("skyblue")

# промені з центру
t.color("orange")
t.width(4)
for _ in range(12):
    t.forward(120)
    t.backward(120)
    t.left(30)

# диск: коло малюється від нижньої точки, тому стаємо на радіус нижче центру
t.penup()
t.goto(0, -70)
t.pendown()
t.width(1)
t.color("orange", "yellow")
t.begin_fill()
t.circle(70)
t.end_fill()

turtle.done()

Що вийде: на блакитному фоні жовтий диск радіусом 70 і 12 помаранчевих променів. Промені по 120 йдуть із центру, диск малюється пізніше і закриває їхню середину, тож назовні видно по 50 пікселів.

Якщо ти переставиш блоки (спершу диск), промені пройдуть поверх нього до центру: що намальовано пізніше, лежить зверху. Одне число: 120 на 200, і промені вийдуть далеко за диск.

7. Райдужна спіраль

import turtle

t = turtle.Turtle()
t.speed(0)
t.width(2)
turtle.bgcolor("black")

colors = ["red", "orange", "yellow", "green", "blue", "purple"]

for i in range(100):
    t.pencolor(colors[i % 6])   # i % 6 — це завжди 0, 1, 2, 3, 4 або 5
    t.forward(i * 2)
    t.left(59)

turtle.done()

Що вийде: на чорному фоні шестикутна спіраль зі 100 ліній, кольори йдуть по колу від червоного до фіолетового, розмір близько 370 × 390. i % 6 — остача від ділення на 6, тому індекс не вилізе за межі списку, скільки б разів ти не повторював цикл.

Зміни одне число: з 60 закрутка зникне, вийдуть вкладені шестикутники з прямими кольоровими секторами. З 61 спіраль закрутиться в інший бік.

8. Прапор України

import turtle

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

def rect(x, y, w, h, color):   # (x, y) — лівий нижній кут
    t.penup()
    t.goto(x, y)
    t.pendown()
    t.color(color, color)
    t.begin_fill()
    for _ in range(2):
        t.forward(w)
        t.left(90)
        t.forward(h)
        t.left(90)
    t.end_fill()

W = 300
H = 200    # пропорції 3 : 2

rect(-160, -250, 10, 450, "saddlebrown")   # древко
rect(-150, 0, W, H / 2, "#0057B7")         # синя смуга
rect(-150, -H / 2, W, H / 2, "#FFD700")     # жовта смуга

turtle.done()

Що вийде: прапор 300 × 200 (пропорція 3 : 2, як у державного), синя смуга зверху, жовта знизу, ліворуч древко. #0057B7 і #FFD700 — поширені коди цих кольорів для екрана. З rect() ти складеш і прапор Франції чи Італії: три вертикальні смуги по W / 3.

Зміни одне число: H = 120. Смуги стануть нижчими й лишаться впритул, бо жовта стоїть на -H / 2. Якщо написати там -100, між смугами з'являється біла щілина: ми перевірили.

9. Квітка з дуг

import turtle

t = turtle.Turtle()
t.speed(0)
t.color("hotpink", "pink")

for _ in range(8):         # 8 пелюсток
    t.begin_fill()
    t.circle(100, 90)       # чверть кола
    t.left(90)
    t.circle(100, 90)       # ще чверть — назад у центр
    t.end_fill()
    t.left(45)             # 360 / 8 = 45

# серединка
t.penup()
t.goto(0, -20)
t.pendown()
t.color("orange", "yellow")
t.begin_fill()
t.circle(20)
t.end_fill()

turtle.done()

Що вийде: рожева квітка з 8 пелюсток і жовта серединка. Пелюстка — дві чверті кола радіусом 100: дугою від центру, розворот на 90°, дугою назад. Вся квітка близько 280 × 280.

Зміни одне число: 45 на 90, і ти побачиш, як усі вісім пелюсток ляжуть в одне місце. Пелюстка сама повертає черепашку на 270°, ще 90 дають повний оберт, тож кожна наступна починається там, де попередня.

10. Нічне місто

import turtle
import random

t = turtle.Turtle()
t.hideturtle()
turtle.bgcolor("midnightblue")
turtle.tracer(0)           # малювати все одразу, без анімації

def go(x, y):
    t.penup()
    t.goto(x, y)
    t.pendown()

def rect(x, y, w, h, color):
    go(x, y)
    t.color(color, color)
    t.begin_fill()
    for _ in range(2):
        t.forward(w)
        t.left(90)
        t.forward(h)
        t.left(90)
    t.end_fill()

# 1. Зірки у випадкових місцях верхньої половини
for _ in range(80):
    go(random.randint(-300, 300), random.randint(0, 280))
    t.dot(random.randint(2, 5), "white")

# 2. Місяць-серп: жовте коло, а поверх — коло кольору неба
go(200, 120)
t.color("khaki", "khaki")
t.begin_fill()
t.circle(40)
t.end_fill()
go(218, 130)
t.color("midnightblue", "midnightblue")
t.begin_fill()
t.circle(40)
t.end_fill()

# 3. П'ять будинків різної висоти з вікнами
for i in range(5):
    x = -300 + i * 120
    h = random.randint(100, 220)
    rect(x, -280, 100, h, "dimgray")
    for row in range(h // 40):          # поверхи
        for col in range(3):            # три вікна на поверсі
            light = random.choice(["gold", "black"])
            rect(x + 12 + col * 28, -265 + row * 40, 18, 22, light)

turtle.update()            # після tracer(0) показати готовий малюнок
turtle.done()

Що вийде: темно-синє небо, 80 зірок, місяць-серп угорі праворуч і п'ять сірих будинків заввишки від 100 до 220 пікселів. Вікна по три на поверх випадково світяться жовтим або темні. Тому щоразу ти отримуєш інше місто. Так і задумано.

Ми зібрали тут усе попереднє: функції, цикл у циклі, заливка, шари (серп — жовте коло, частково закрите колом кольору неба). Нове лише turtle.tracer(0): черепашка не показує кожен крок, і сотні ліній з'являються майже одразу. Але після цього екран сам не оновлюється, тому перед done() стоїть turtle.update(), без нього частина малюнка може не з'явитися.

Зміни одне число: range(300) замість 80 дасть густе небо.

Зламаний приклад: чому фігура не замикається

Найчастіша помилка в черепашці — кут. Ось шестикутник, у якому ми навмисно помилилися:

import turtle

t = turtle.Turtle()
t.width(3)

for _ in range(6):
    t.forward(100)
    t.left(50)       # помилка: для шестикутника треба 360 / 6 = 60

print(t.position())
turtle.done()

У консолі:

(-67.86,96.91)

Шість сторін пройдено. А поворот лише 6 × 50 = 300°. Бракує 60°, тож на екрані незамкнений многокутник, схожий на літеру С, і кінець лінії висить за 118 пікселів від старту.

print(t.position()) годиться як перевірка будь-якої твоєї фігури: замкнута дасть (0.00,0.00), іноді з мінусом перед нулем — це похибка дробових чисел. А кут краще не підбирати, а рахувати:

import turtle

t = turtle.Turtle()
t.width(3)

def polygon(n, side):
    for _ in range(n):
        t.forward(side)
        t.left(360 / n)

polygon(6, 100)
print(t.position())
turtle.done()

polygon(3, 100) дає трикутник, polygon(36, 20) майже коло. Інші помилки новачків (відступи, дужки, двокрапки) зібрані в статті про типові помилки в Python.

Що намалювати самому

Коли всі десять у тебе запрацюють, збери щось своє з тих самих команд:

  • сніжинку: шість гілок через 60°, на кожній по дві гілочки (цикл у циклі);
  • веселку з півкіл t.circle(r, 180), кожна наступна менша на 10;
  • вулицю з будиночків, де висота береться з random.randint.

На ступені Python Старт (6–10 років) у нас із таких малюнків починається текстовий код: помилка в рядку одразу видна на картинці. Потім із тієї ж черепашки роблять перші ігри, а далі переходять на Pygame — ось як виглядає перша гра.