Урок 1.Толщина линии
Перо черепашки
Черепашка рисует пером. Как у ручки или карандаша — пока перо касается бумаги, остаётся след. Пока не касается — ничего не рисуется. Мы уже знаем две команды: t.penup() и t.pendown().
По умолчанию перо опущено. То есть черепашка начинает рисовать сразу, как только ты её создал.
Толщина линии: pensize
У пера есть толщина. По умолчанию она равна 1 — тонкая линия. Но её можно менять:
import turtle
t = turtle.Turtle()
t.pensize(5)
t.forward(100)
turtle.done()
Число в скобках — толщина в пикселях. Чем больше — тем толще линия.
t.pensize(1) # тонкая, почти волосок
t.pensize(5) # заметная
t.pensize(20) # жирная
t.pensize(50) # очень жирная — почти полоса
Есть и второй вариант той же команды — width(). Работает точно так же:
t.width(10) # то же самое, что pensize(10)
Толщина действует до следующего изменения
Это важно понять. Когда ты ставишь pensize(10), все последующие линии будут толщиной 10 — пока не поставишь другое значение.
import turtle
t = turtle.Turtle()
t.pensize(2)
t.forward(50) # толщина 2
t.forward(50) # всё ещё 2
t.pensize(8)
t.forward(50) # теперь 8
t.forward(50) # и это 8
turtle.done()
Это как взять другую ручку. Пока не поменяешь — рисуешь этой.
Толщина меняется на ходу
Самое интересное начинается, когда меняешь толщину внутри цикла. Тогда линия «растёт» или «худеет» на глазах:
import turtle
t = turtle.Turtle()
t.speed(0)
for i in range(1, 30):
t.pensize(i)
t.forward(15)
t.right(10)
turtle.done()
С каждым шагом линия становится толще. Получается закручивающаяся спираль, которая расширяется.
А можно наоборот — от толстой к тонкой:
import turtle
t = turtle.Turtle()
t.speed(0)
for i in range(30, 0, -1):
t.pensize(i)
t.forward(15)
t.right(10)
turtle.done()
Получается эффект «затухания» — линия начинается жирной и постепенно сходит на нет.
Скорость и толщина
Одна тонкость: если много раз менять толщину в цикле (например, на 100 шагов), черепашка будет ползти очень медленно. Поэтому перед такими экспериментами ставь t.speed(0). Иначе можно заскучать, глядя, как она рисует.
Задание 1. Нарисуй три параллельные линии: тонкую, среднюю и толстую. Используй
pensize() и penup() с pendown().
Задание 2. Нарисуй квадрат, у которого каждая сторона толще предыдущей. Подсказка: ставь
pensize() перед каждой стороной.
Задание 3. Нарисуй спираль, у которой линия постепенно толстеет от центра к краю. Начни с
pensize(1) и увеличивай на 1 каждый шаг.
Задание 4. Сделай «дыхание»: нарисуй линию, у которой толщина плавно растёт от 1 до 20, а потом плавно падает обратно до 1. Подсказка: понадобятся два цикла.
Урок 2.Что такое цвет
Прежде чем давать черепашке цветные команды, давай разберёмся, что такое цвет вообще.
Свет — это волны
Свет — это электромагнитные волны. Как волны на воде, только очень-очень маленькие. У каждой волны есть длина. Длины бывают самые разные, и они образуют непрерывный ряд — от самых длинных до самых коротких. Радуга — это видимая часть этого ряда: красный плавно переходит в оранжевый, потом в жёлтый, и так до фиолетового. Между ними нет границ — есть миллионы оттенков.
Большую часть этого ряда глаз вообще не видит. Инфракрасное излучение — это волны длиннее красного. Ультрафиолет — короче фиолетового. Мы их не видим, но они есть.
Глаз видит только три вещи
А теперь самое интересное. Хотя спектр непрерывный, глаз не различает все длины волн по отдельности. Внутри глаза есть специальные клетки — колбочки. Их три вида:
- Одни лучше всего реагируют на длинные волны (условно — красная область).
- Вторые — на средние (зелёная область).
- Третьи — на короткие (синяя область).
Каждая колбочка не говорит мозгу «пришла волна длиной ровно 530 нанометров». Она говорит только «я сработала вот с такой силой». Мозг получает три числа — и из них собирает ощущение цвета.
Надо понимать, что это верно только для человека. У животных: птиц, зверей, насекомых — это количество разное. Более того, с возрастом чувствительность к разным цветам изменяется. И есть люди, которые не воспринимают все цвета — дальтоники. Но в целом схема из трёх цветов действует.
Почему это важно
Получается, что глаз не читает спектр целиком. Он сжимает всё многообразие волн в три сигнала. И если два разных набора волн дают одинаковые три сигнала — глаз не отличит их друг от друга.
Это и есть ключ ко всему. Можно взять три лампочки — красную, зелёную и синюю — и подобрать их яркости так, чтобы они дали точно такие же три сигнала, как настоящий жёлтый свет. Глаз не заметит подмены. Он увидит жёлтый.
Именно на этом работает весь цветной экран.
RGB — это про глаз, а не про свет
RGB — это не «три цвета, из которых состоит свет». Это модель человеческого зрения.
- R — Red (красный)
- G — Green (зелёный)
- B — Blue (синий)
Три числа в RGB говорят не «сколько в этом цвете красного света», а «с какой силой надо зажечь три лампочки, чтобы глаз увидел вот это».
Поэтому два совершенно разных физических света могут выглядеть одинаково. Это называется метамерия. Например, монохроматический жёлтый (одна волна) и смесь красного с зелёным (две волны) — для глаза одно и то же.
Как смешиваются цвета
Поскольку RGB — это про три лампочки, смешивание работает не так, как с красками:
Красный Зелёный Синий Получается
0 0 0 чёрный
100% 0 0 красный
0 100% 0 зелёный
0 0 100% синий
100% 100% 0 жёлтый
0 100% 100% голубой
100% 0 100% розовый (маджента)
100% 100% 100% белый
Чем больше света — тем светлее. Все три на максимуме — белый.
Как записывают цвет
Каждый канал измеряется числом от 0 до 255. Почему 255? Потому что это максимум, который помещается в один байт — восемь нулей и единиц.
(255, 0, 0) # чистый красный
(0, 255, 0) # чистый зелёный
(0, 0, 255) # чистый синий
(255, 255, 0) # жёлтый
(255, 255, 255) # белый
(0, 0, 0) # чёрный
(128, 128, 128) # серый
(255, 128, 0) # оранжевый
HEX-код — короткая запись
Писать (255, 128, 0) неудобно. Поэтому есть короткая запись — HEX-код: #FF8000.
#— знак, что это цвет.FF— красный канал (255).80— зелёный канал (128).00— синий канал (0).
Шестнадцатеричные цифры идут от 0 до 9, потом от A до F (A = 10, F = 15). Запись FF — это 15 × 16 + 15 = 255.
HEX-коды ты увидишь в графических редакторах, в настройках сайтов, в палитрах.
Зачем это нужно
Понимание RGB даёт доступ к цвету на уровне управления: задать точный оттенок, сделать цвет чуть светлее или темнее, генерировать цвета случайно, создавать градиенты.
В следующем уроке мы будем пользоваться и названиями ("red"), и HEX-кодами. А в конце — покажем, как задать цвет тройкой чисел. Теперь ты знаешь, что за всем этим стоит.
(255, 255, 255)? А из (0, 0, 0)? А из (255, 255, 0)?
Урок 3.Цвет в черепашке
Цвет пера и цвет заливки
У черепашки есть два цвета:
- Цвет пера — каким цветом рисуется линия.
- Цвет заливки — каким цветом заполняется фигура изнутри.
Пока мы работаем только с пером. Заливка понадобится в следующей неделе, когда будем рисовать фигуры. Но знать про второй цвет стоит уже сейчас.
Названия цветов
Самый простой способ — назвать цвет словом:
import turtle
t = turtle.Turtle()
t.pensize(5)
t.color("red")
t.forward(100)
turtle.done()
Работают десятки имён: "red", "blue", "green", "yellow", "orange", "purple", "pink", "black", "white", "brown", "gray" и ещё много других. Всего около 150 названий.
Это самый удобный способ для начала. Но у него есть минус: оттенков всего 150, а хочется иногда точнее.
HEX-код
Если нужен конкретный оттенок — используй HEX-код:
import turtle
t = turtle.Turtle()
t.pensize(10)
t.color("#FF5733") # оранжево-красный
t.forward(100)
t.penup()
t.goto(0, -40)
t.pendown()
t.color("#1E90FF") # ярко-синий
t.forward(100)
turtle.done()
Помнишь, как он устроен? #, потом три пары цифр: красный, зелёный, синий. Этот код можно подсмотреть в любом графическом редакторе — например, выбрать цвет пипеткой и скопировать.
RGB-числа и функция rgb()
А теперь — связь с прошлым уроком. Помнишь, что цвет — это три числа от 0 до 255? Хочется задавать цвет именно так: (255, 87, 51).
В обычном Python для этого есть команда colormode(255). Но в Brython она не работает. Значит, задать цвет тремя числами напрямую нельзя.
Но выход есть. Помнишь HEX-код? Это ведь та же самая информация, только записанная иначе. Значит, можно превратить RGB-числа в HEX-строку — и скормить её черепашке.
Для этого напишем маленькую функцию:
def rgb(r, g, b):
return f'#{r:02x}{g:02x}{b:02x}'
Что она делает:
- Берёт три числа — красный, зелёный, синий.
- Превращает каждое в шестнадцатеричную запись из двух цифр.
- Приклеивает их к
#— и получается HEX-код.
Запись :02x означает: «выведи число в шестнадцатеричном виде, минимум две цифры, недостающие заполни нулями». Например, 255 превратится в ff, а 5 — в 05.
Теперь можно работать как раньше:
import turtle
def rgb(r, g, b):
return f'#{r:02x}{g:02x}{b:02x}'
t = turtle.Turtle()
t.pensize(10)
t.pencolor(rgb(255, 105, 180)) # розовый (Hot Pink)
t.forward(100)
turtle.done()
Этот приём работает и в Brython, и на локальном Python. Так что можно пользоваться им всегда — и не думать о режимах.
colormode(255) в Brython не поддерживается. Если увидишь её в чужом коде — знай, что у нас вместо неё — функция rgb().
Отдельно перо и заливка
Вернёмся к двум цветам. Их можно задать двумя способами.
Способ 1: одной командой. Первое число — цвет пера, второе — цвет заливки:
t.color("red", "yellow") # перо красное, заливка жёлтая
Способ 2: по отдельности.
t.pencolor("blue") # только цвет пера
t.fillcolor("green") # только цвет заливки
Заливка нам пока не нужна — мы займёмся ей в следующей неделе. А вот pencolor() пригодится уже сейчас.
Цвет фона
Цвет фона задаётся отдельно, через экран:
import turtle
screen = turtle.Screen()
screen.bgcolor("lightblue")
t = turtle.Turtle()
t.pensize(5)
t.color("navy")
t.forward(120)
turtle.done()
Это не цвет пера и не цвет заливки — это цвет всего окна. Полезно, когда рисуешь что-то светлое и хочешь, чтобы оно выделялось.
Цвет и толщина вместе
Цвет и толщина — независимые настройки. Их можно менять как угодно:
import turtle
t = turtle.Turtle()
t.speed(0)
colors = ["red", "orange", "yellow", "green", "blue", "purple"]
for i, color in enumerate(colors):
t.color(color)
t.pensize(i * 3 + 1)
t.forward(80)
t.right(60)
turtle.done()
Каждый отрезок — своего цвета и своей толщины. Получается радужная фигура, которая расширяется.
Пример: разноцветные лучи
import turtle
t = turtle.Turtle()
t.speed(0)
colors = ["red", "orange", "yellow", "green", "blue", "purple"]
for i, color in enumerate(colors):
t.color(color)
t.pensize(i * 2 + 1)
t.setheading(i * 60)
t.forward(100)
t.backward(100)
turtle.done()
Шесть лучей во все стороны. Каждый — своего цвета и своей толщины.
Задание 1. Нарисуй три линии разного цвета: красную, зелёную и синюю. Используй
color() и penup() с pendown().
Задание 2. Нарисуй квадрат, у которого каждая сторона — своего цвета.
Задание 3. Найди в интернете HEX-код своего любимого цвета и нарисуй им любую фигуру.
Задание 4. Сделай «радугу»: нарисуй шесть линий подряд, каждая — своего цвета из списка, и каждая толще предыдущей.
Задание 5. Поставь фон
"lightyellow" и нарисуй на нём разноцветные лучи.
Урок 4.Случайность
Модуль random
Для случайностей в Python есть модуль random. Его нужно подключить в начале программы:
import random
После этого доступны две полезные команды:
random.choice(список)— выбирает случайный элемент из списка.random.randint(от, до)— возвращает случайное целое число в диапазоне.
Случайный цвет из списка
Самый наглядный способ. Делаем список цветов и на каждом шаге берём случайный:
import turtle
import random
t = turtle.Turtle()
t.speed(0)
colors = ["red", "orange", "yellow", "green", "blue", "purple"]
for _ in range(20):
t.color(random.choice(colors))
t.forward(50)
t.right(45)
turtle.done()
random.choice(colors) означает «выбери случайный элемент из списка». Каждый запуск — новая картинка с уникальным сочетанием цветов.
Случайный HEX-код
HEX-код — это # и шесть символов от 0 до F. Значит, можно генерировать его случайно:
import turtle
import random
t = turtle.Turtle()
t.speed(0)
hex_symbols = "0123456789ABCDEF"
def random_color():
code = "#"
for _ in range(6):
code += random.choice(hex_symbols)
return code
for _ in range(20):
t.color(random_color())
t.forward(50)
t.right(45)
turtle.done()
Здесь мы собрали свою функцию random_color(). Она выбирает шесть случайных символов из набора 0123456789ABCDEF, приклеивает их к # и возвращает готовый HEX-код.
Этот способ даёт любой возможный цвет — не только из списка.
Случайные RGB-числа
Помнишь RGB? Три числа от 0 до 255. Каждое можно сделать случайным:
import turtle
import random
def rgb(r, g, b):
return f'#{r:02x}{g:02x}{b:02x}'
t = turtle.Turtle()
t.speed(0)
for _ in range(20):
r = random.randint(0, 255)
g = random.randint(0, 255)
b = random.randint(0, 255)
t.color(rgb(r, g, b))
t.forward(50)
t.right(45)
turtle.done()
random.randint(0, 255) возвращает случайное целое число от 0 до 255 включительно. Три таких числа — и получается случайный цвет.
Этот способ работает и в Brython, потому что мы используем функцию rgb(), а не colormode(255).
Случайная толщина и случайный угол
Кроме цвета, можно делать случайными ещё две вещи: толщину линии и угол поворота. Вместе получается очень живой рисунок:
import turtle
import random
t = turtle.Turtle()
t.speed(0)
colors = ["red", "orange", "yellow", "green", "blue", "purple"]
for _ in range(50):
t.color(random.choice(colors))
t.pensize(random.randint(1, 15))
t.forward(80)
t.right(random.randint(0, 360))
turtle.done()
Каждый отрезок — случайного цвета, случайной толщины и под случайным углом. Каждый запуск даёт уникальную картинку.
Случайность — это не беспорядок
Если хочется, чтобы картинка была красивой, а не просто случайной, лучше ограничить палитру. Например, только «тёплые» цвета:
colors = ["red", "orange", "yellow", "gold", "coral"]
или только «холодные»:
colors = ["blue", "cyan", "teal", "navy", "skyblue"]
Случайность внутри одной гаммы выглядит гораздо приятнее, чем полный хаос.
import turtle
import random
t = turtle.Turtle()
t.speed(0)
colors = ["red", "orange", "yellow", "gold", "coral"]
for _ in range(40):
t.color(random.choice(colors))
t.pensize(random.randint(2, 10))
t.forward(70)
t.right(random.randint(30, 90))
turtle.done()
Пример: разноцветная спираль
import turtle
import random
t = turtle.Turtle()
t.speed(0)
colors = ["red", "orange", "yellow", "green", "blue", "purple"]
for i in range(100):
t.color(random.choice(colors))
t.forward(i * 2)
t.right(59)
turtle.done()
Спираль, где каждый отрезок — случайного цвета. Форма всегда одинаковая, а цвета каждый раз новые.
Задание 1. Нарисуй 10 линий в случайных цветах из списка. Подсказка: используй
random.choice и цикл.
Задание 2. Нарисуй спираль, где цвет каждого отрезка выбирается случайно из HEX-генератора.
Задание 3. Нарисуй случайную картинку: 30 отрезков, у каждого случайный цвет, случайная толщина и случайный угол поворота.
Задание 4. Сделай «тёплую» палитру (
red, orange, yellow, gold) и нарисуй случайную картинку только в этих цветах. Сравни с полным набором — что выглядит приятнее?
Задание 5. Сделай свою функцию
random_color_from_list() — она должна принимать список цветов и возвращать случайный из них. Примени её для рисования.