Коротко: черепашка (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 — ось як виглядає перша гра.