Черепашкова графіка

 

Черепашкова графіка

Розглянемо як Python працює з графікою.

Для цього створимо новий проєкт, з назвою Turtle (черепашка), а як мову програмування треба обрати Python (with Turtle) (відео 1): 

 Відео 1

Інтерфейс відрізняється лише тим, що у верхньому правому куті з'явилося додаткове вікно, де й буде розміщена графіка (мал. 1):

N8EzRItZXCrr3F7RhzAli5Kz8GuwHLOC
Малюнок 1

Пропишемо:

import turtle
turtle.shape("turtle")

Запустимо його. У верхньому правому куті побачимо (мал. 2):

KzQ5UUEjCe5ErDqQ1SunsfPBaTiERk3R
Малюнок 2

У нас з'явилася черепашка. А тепер розберемося, як саме ці два чарівні рядки намалювали нам її? У першому рядку ми імпортували модуль (файл) з назвою turtle, тобто залучили його до нашого проєкту. Але часто модулі групуються та об'єднуються в бібліотеки, тобто бібліотеки — це набір модулів (файлова збірка). Вони, як і модулі, допомагають проводити операції з даними. Аби краще зрозуміти сенс бібліотек, уявимо життєву ситуацію: у вас зламалася машина. Звичайно, вам хочеться її відремонтувати, і ви можете це зробити, але для цього необхідно мати інструменти та знання. Отже, вам знадобиться багато часу, аби розв'язати цю задачу. Розуміючи це, ви звертаєтесь на СТО, де це питання буде вирішене набагато швидше. Так само й бібліотекиспрощують процес написання коду. Цей інструмент, результат діяльності інших програмістів, які вже стикалися з подібними питаннями, і вирішили їх, зробивши так, щоби наступний, хто стикнеться з цим, не "вигадував велосипед". Саме це йдає змогу писати програми в декілька рядків. Зовсім необов'язково знати про всі бібліотеки, адже їх дуже багато, для пошуку достатньо погуглити.

Бібліотеки та модулі бувають вбудованими та зовнішніми. Вбудовані — встановлюються разом з Python, зовнішні — потребують встановлення й налаштування.

Тепер розглянемо другий рядок. У ньому ми викликали функцію shape(), але оскільки вона міститься в модулі turtle, необхідно прописати назву модуля в назві функції, розділивши їх крапкою. Якщо модуль входить до бібліотеки, то її назву треба вказувати перед назвою модуля, так само розділяючи назви крапкою. Це можна порівняти з деревом (мал. 3):

2vb7hU0gW55XuwvblPICUdzk8ug3JOjS
Малюнок 3

Але з модулів можна імпортувати не лише функції, а й будь-які інші дані, які в ньому є. Необхідно лише правильно вказати їх назву та шлях до них.

Отже, у нашому випадку маємо (мал. 4):

dyxi6Xu55mpzcwwWXZmsevBhSg7k-Je1
Малюнок 4

Але кожного разу прописувати назви модулів і бібліотек незручно. Томує лайфхаки, які значно спрощують цей процес. Зітремо наш код, а на його місці пропишемо:

from turtle import *
shape("turtle")

Запустимо його. Як видно, результат той самий. На відміну від попереднього, тут ми імпортували не сам модуль, а всю інформацію (функції й дані), яка в ньому міститься. Але імпортувати всі дані з модуля — не краще рішення, адже можна ненароком зламати власний код, бо назви змінних, даних, функцій можуть збігтися. Тому, оскільки нам потрібна лише функція shape(), імпортуємо лише її. Запишемо:

from turtle import shape
shape("turtle")

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

Тепер у нас є черепашка, і ми знаємо різні способи, як вивести її на екран. Але вона також вміє рухатись, лишаючи слід. Тому, окрім функції shape(), імпортуємо функцію forward(). Для цього достатньо в першому рядку дописати цю назву, розділивши назви функцій комою. Маємо:

from turtle import shape, forward
shape("turtle")

Імпорт функції forward() ми зробили, тепер давайте її використаємо. Як аргумент, функція приймає кількість пікселів, що має пройти черепашка. На наступному рядку додамо:

forward(150)

Запустимо код (відео 2):

Відео 2 

Наша черепашка намалювала лінію.

Зауважимо, імпорти заведено прописувати вгорі файлу. Тоді вони є очевидними й іншим програмістам буде легше налаштувати роботу програми.

Фігури

Кожна геометрична фігура, наприклад, квадрат, трикутник або коло складається з точок, прямих і кривих ліній. Тож спробуємо намалювати їх із допомогою вже знайомого модуля turtle. Але працюючи з новою бібліотекою або модулем, рекомендується почитати їхню документацію, адже саме там вказано, які функції вони можуть реалізовувати. Якщо вам цікавий весь функціонал нашої "черепашки", можете ознайомитися з ним за посиланням.

Малюємо прямокутник

Отже, наша черепашка може рухатись, залишаючи слід. Цим ми й скористаємось. А першим спробуємо нарисувати прямокутник.

Ми вже маємо лінію, яка й буде першою його стороною. Але функція forward() лише направляє черепашку вперед. Тому для рисування прямокутника необхідно навчитись її повертати.

У цьому нам допоможуть методи left() і right(). Тому змінимо перший рядок, включивши ці методи до імпорту.

Маючи першу сторону прямокутника, залишилось дорисувати наступні три. Оскільки ми знаємо, що в прямокутнику всі сторониперетинаються під прямим кутом, то повертати черепашку будемо відповідно на 90 градусів. Для цього всередину методу left() вставимо значення «90». Тепер знову попросимо черепашку пройти вперед, але на 100 пікселів уже знайомим методом forward(). Отже, наш код набувтакого вигляду:

from turtle import shape, forward, left, right
shape("turtle")
forward(150)
left(90)
forward(100)

Запустимо код (відео 3):

 Відео 3

Чудово! Тепер ми знаємо всі методи, аби завершити прямокутник. Просто повертаємо черепашку ліворуч і рухаємо вперед на 150 пікселів, після чого ще раз повертаємо черепашку й рухаємо вперед на 100 пікселів. Готовий код буде такий:

from turtle import shape, forward, left, right
shape("turtle")
forward(150)
left(90)
forward(100)
left(90)
forward(150)
left(90)
forward(100)

Подивимось, що в нас вийшло (відео 4):

Відео 4 

Готово! Ми нарисували прямокутник із допомогою черепашки.

Цікаво також те, що можна змінювати колір, яким рисує черепашка, колір заливки фігури та швидкість руху черепашки. Для цього використовуються методи color() і speed() відповідно. Тож імпортуємо їх.

У метод color() передаємо рядки з назвами кольорів. За такої умови перший аргумент відповідає за колір лінії, другий — за колір черепашки. До методу speed() передаємо швидкість у числовому форматі. Наприклад:

color("red", "green")
speed(2)

Але будьте обачними, вставити цей код необхідно до команд на рух черепашки. Отже, маємо (відео 5):

 Відео 5

Рисуємо коло

Ми нарисували прямокутник, тож тепер на черзі коло! 

Черепашка досить легко може з цим впоратися. Для цього достатньо скористатися методом circle(), у який необхідно передати радіус кола в пікселях. Але бачимо, що рядок імпортів уже досить довгий. Оскільки наш проєкт поки що невеликий, замінимо всі назви імпортів уже знайомою зірочкою. Тепер видалимо частину коду, за допомогою якої ми рисували прямокутник та допишемо:

circle(80)

Після запуску отримуємо (відео 6):

 Відео 6

Але як нарисувати окремі фігури? 

Turtle має ще два цікавих методи — penup() і pendown(). Вонидають змогу вимикати та вмикати слід, який залишає за собою черепашка. Нарисуємо два кола, які перетинаються. Для цього рисуємо перше коло, вимикаємо слід методом penup(), після чого переміщуємо черепашку на 80 пікселів із допомогою forward(), вмикаємо слід методом pendown(), і рисуємо друге коло. Частина коду, відповідального за рух черепашки, буде такою:

circle(80)
penup()
forward(80)
pendown()
circle(80)

Виконаємо код (відео 7).

 Відео 7

Наостанок, спробуємо змінити колір одного з наших кіл, заливши його. У цьому нам допоможуть методи begin_fill() та end_fill(). Своєю чергою першим ми оголошуємо про початок заливки фігури, другим — про кінець. Звідси випливає, що розташовувати перший метод необхідно до початку команд на створення фігури, другий — після того, як черепашка її намалювала. Водночас колір заливки матиме колір черепашки. Додатково змінимо товщину лінії, скориставшись методом pensize(). Всередину методу передамо бажану товщину лінії в пікселях, наприклад, число 5. Маємо (відео 8):

Відео 8

Отже, ми попрацювали з turtle! Навчилися рисувати прості фігури. Розглянули основні її функції й навчились імпортувати дані. А на наступних заняттях нас чекають цікаві та видовищні проєкти, які ми створимо з допомогою цієї потужної мови програмування!