Способы работы с цветовой гаммой в Python: теория и практика

Раздел: Python -> Turtle и другие

Как задавать цвета в Python для графики

В Python цвета можно задавать несколькими способами: по имени (например, red), шестнадцатеричным кодом (#FF0000), тройкой RGB (красный, зелёный, синий) от 0 до 1 или от 0 до 255, а также через HSL или другие цветовые модели. Выбор способа зависит от решаемой задачи и используемой библиотеки (Turtle, Matplotlib, Pillow, Tkinter). Ниже рассмотрены наиболее распространённые варианты для модуля turtle.

Базовый эффективный метод: кортеж RGB с colormode(255)

Как задать произвольный цвет с максимальной точностью?

Самый надёжный способ для Turtle – установить цветовой режим colormode(255), после чего передавать в методы color(), pencolor(), fillcolor() или bgcolor() кортеж из трёх целых чисел от 0 до 255.

import turtle
turtle.colormode(255)
turtle.color((255, 0, 0))          # красный
turtle.begin_fill()
turtle.circle(50)
turtle.end_fill()
turtle.done()

Python 3d models (3d модели в python)

Пояснение: функция colormode(255) переключает внутреннее представление цвета на диапазон 0–255. Если этого не сделать, значения 255, 0, 0 будут интерпретированы как 1.0, 0.0, 0.0 в режиме по умолчанию (0–1), что тоже даст красный. Однако использование целых чисел без смены режима приведёт к ошибке (число > 1).

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

Забывают вызвать colormode(255) и передают, например, (200, 100, 50). В результате Turtle пытается интерпретировать 200 как долю от 1 (что больше 1) и округляет до 1, получается белый или очень светлый оттенок. Решение: всегда первым делом изменять цветовой режим.

Другая проблема – передача целых чисел через запятую без скобок: color(255, 0, 0). Такой синтаксис тоже допустим, но если передать больше трёх аргументов, возникнет TypeError.

Вариант 1: Именованные цвета

Как использовать встроенные названия цветов?

Turtle поддерживает многие названия из спецификации X11 (например, "red", "lightblue", "mediumspringgreen"). Названия регистронезависимы, но лучше писать строчными.

import turtle
turtle.color("darkorange")
turtle.forward(100)

библиотека graphics python (библиотека graphics в python)

Проблема:

Если указать несуществующее имя, например "blu", возникнет TurtleGraphicsError. Имена цветов ограничены – около 140. Решение: проверять имя по официальному списку (например, 'aliceblue', 'antiquewhite', ... ).

Вариант 2: Шестнадцатеричные коды (HEX)

Как задать цвет через строку вида #RRGGBB?

Turtle принимает строки, начинающиеся с символа # и содержащие шесть шестнадцатеричных цифр. Регистр букв не важен.

import turtle
turtle.color("#A52A2A")  # коричневый
turtle.forward(100)

какие цвета в python (цвета в python)

Ошибка:

Если забыть символ # или указать меньше шести цифр, код будет распознан как имя цвета (и, скорее всего, не найден). Решение: всегда ставить # и ровно 6 цифр.

Вариант 3: Дробный RGB (0–1)

Как использовать числа с плавающей точкой без вызова colormode?

Режим по умолчанию – colormode(1.0). Тройка чисел от 0.0 до 1.0 воспринимается корректно.

import turtle
turtle.color(0.5, 0.8, 0.2)   # зеленоватый
turtle.forward(70)

Turtle program python (turtle графика в python)

Это удобно при математических расчётах, но может привести к путанице с целыми числами.

Вариант 4: Конвертация из HSL с помощью модуля colorsys

Как задать цвет, используя тон, насыщенность и светлоту?

Модуль colorsys позволяет преобразовывать HSL в RGB (в диапазоне 0–1). Затем можно установить colormode(1.0) или умножить на 255.

import turtle, colorsys
turtle.colormode(1.0)
h, s, l = 0.7, 0.9, 0.5   # тон 252°, насыщенность 90%, светлота 50%
r, g, b = colorsys.hls_to_rgb(h, l, s)  # порядок: H, L, S
turtle.color(r, g, b)
turtle.circle(40)

библиотека рисования python (библиотеки для рисования в python)

Замечание:

Функция hls_to_rgb принимает (Hue, Lightness, Saturation), а не (H, S, L). Путаница в порядке аргументов – частая ошибка. Результат – кортеж (R, G, B) в диапазоне 0–1.

Вариант 5: Случайный цвет

Как сгенерировать случайный оттенок?

Генерация трёх целых чисел от 0 до 255 и передача их после установки colormode(255).

import turtle, random
turtle.colormode(255)
r = random.randint(0,255)
g = random.randint(0,255)
b = random.randint(0,255)
turtle.color(r, g, b)
turtle.begin_fill()
turtle.circle(30)
turtle.end_fill()

Qr кода python (qr-код на python)

Проблема:

Случайные цвета могут быть слишком яркими или бледными. Для пастельных тонов стоит выбирать значения в диапазоне 100–200. Решение: задать диапазон вручную или использовать генерацию с фиксированной насыщенностью.

Вариант 6: Внешние библиотеки (Matplotlib, Pillow)

Как использовать расширенные палитры?

Matplotlib содержит множество цветовых карт ('viridis', 'plasma'). Можно получить HEX-код и передать его в Turtle. Аналогично с Pillow.

import matplotlib.pyplot as plt
import turtle

# Получаем цвет из палитры 'viridis' для значения 0.5
rgba = plt.cm.viridis(0.5)   # возвращает (R,G,B,alpha) в 0-1
turtle.colormode(1.0)
turtle.color(rgba[0], rgba[1], rgba[2])
turtle.circle(20)

Сложность:

Matplotlib возвращает кортеж из четырёх чисел (RGBA), альфа-канал в Turtle не используется – его нужно отбросить. Также требуется установка библиотеки.

Расширенные примеры работы с цветами

Градиент от красного к синему в Turtle

Плавное изменение цвета при рисовании линии с шагом.

Пример
import turtle
turtle.colormode(255)
turtle.speed(0)
for i in range(256):
    r = 255 - i
    g = 0
    b = i
    turtle.color(r, g, b)
    turtle.forward(1)
    turtle.right(0.5)
turtle.done()
Рисуется спираль, цвет плавно переходит от красного к синему.

Радуга по кругу

Использование конвертации HSV в RGB для создания радужного круга.

Пример
import turtle, colorsys, math
turtle.colormode(1.0)
turtle.speed(0)
for angle in range(360):
    h = angle / 360.0  # тон от 0 до 1
    r, g, b = colorsys.hsv_to_rgb(h, 1.0, 1.0)
    turtle.color(r, g, b)
    x = 100 * math.cos(math.radians(angle))
    y = 100 * math.sin(math.radians(angle))
    turtle.goto(x, y)
    turtle.forward(5)
turtle.done()
На экране появится круг с радужными точками.

Анимация плавного изменения цвета (мерцание)

Изменение оттенка фона или объекта по времени.

Пример
import turtle, time
turtle.colormode(255)
screen = turtle.Screen()
for step in range(100):
    r = int(127 + 128 * math.sin(step * 0.1))
    g = int(127 + 128 * math.sin(step * 0.1 + 2.0))
    b = int(127 + 128 * math.sin(step * 0.1 + 4.0))
    screen.bgcolor(r, g, b)
    time.sleep(0.05)
Фон окна плавно меняет цвет, создавая эффект перелива.

Создание собственной палитры из файла

Чтение цветов из текстового файла с HEX-кодами.

Пример
# colors.txt (построчно):
# FF5733
# 33FF57
# 3357FF

import turtle
turtle.colormode(255)
with open('colors.txt') as f:
    for line in f:
        hex_color = '#' + line.strip()
        turtle.color(hex_color)
        turtle.begin_fill()
        turtle.circle(20)
        turtle.end_fill()
        turtle.forward(50)
turtle.done()
Черепаха рисует последовательность кругов, цвета загружаются из файла.

Конвертация между системами: HEX → RGB → HSL

Пример функции для преобразования шестнадцатеричного кода в кортеж RGB.

Пример
def hex_to_rgb(hex_code):
    hex_code = hex_code.lstrip('#')
    return tuple(int(hex_code[i:i+2], 16) for i in (0, 2, 4))

print(hex_to_rgb('#FF5733'))  # (255, 87, 51)
(255, 87, 51)

Использование случайных пастельных цветов

Генерация мягких тонов.

Пример
import turtle, random
def pastel():
    return (random.randint(180,255), random.randint(140,200), random.randint(180,255))

turtle.colormode(255)
for _ in range(10):
    turtle.color(pastel())
    turtle.begin_fill()
    turtle.circle(30)
    turtle.end_fill()
    turtle.forward(70)
Десять кругов в пастельных тонах.

Цветовая карта из Matplotlib в Turtle

Отображение всей палитры 'plasma' на отрезке.

Пример
import matplotlib.pyplot as plt
import turtle
turtle.colormode(1.0)
turtle.speed(0)
for i in range(256):
    rgba = plt.cm.plasma(i/255)
    turtle.color(rgba[0], rgba[1], rgba[2])
    turtle.forward(2)
turtle.done()
Горизонтальная линия, окрашенная в цвета палитры plasma.

Цвета в Python - comments

En
какие цвета в python (python)