Рубрики
Без рубрики

Как печатать цветной текст на Python

В этой статье показано, как мы можем печатать цветные выходные данные в терминале с библиотеками Python и без них. Давайте погрузимся в изучение того, как это работает!

Автор оригинала: Sathiya Sarathi Gunasekaran.

Вступление

Это типично для приложений CLI, чтобы вернуть текст в том же цвете терминала. Всегда есть случаи, когда мы хотим выделить вывод для пользователя, например, предупреждение или сообщение об ошибке. В этих случаях цветовая черта может иметь значение.

В этой статье показано, как печатать цветные выходные данные в терминале на Python с библиотеками и без них.

Escape-последовательности ANSI

Ваш Teletypewriter (TTY), или, скорее, ваш терминал, не только способен показывать вывод программы. Он может отображать движущийся курсор, окрашивать текст, очищать весь экран и многое другое, чем просто статический вывод. Возможно, вы видели утилиты командной строки с красочным текстом и индикаторами выполнения. Как мы контролируем представление данных, которые мы выводим на терминал?

Мы используем Escape-последовательности ANSI/Коды . Это специальные строки, которые изменяют поведение терминала. Знакомым примером может служить символ \n , представляющий собой последовательность New Line . Ввод этого символа приведет к печати новой строки в выходных данных.

Текст окрашивается на вашем терминале на основе Escape-последовательностей ANSI. Эта статья посвящена escape-последовательностям для цветного текста.

В терминалах широко используются две цветовые схемы:

  • 16 цветов (8 фоновых + 8 передних)
  • 256 цветов

Давайте начнем раскрашивать ваш вывод с помощью опции 16 цветов.

16 Цветов в необработанном питоне

Схема 16 цветов включает в себя два набора по 8 цветов каждый (8 фонов и 8 передних планов), и они могут быть отображены в терминале с помощью следующего синтаксиса:

синтаксис 16 цветов

Давайте проверим это, напечатав дрянной цветной узор с красным жирным текстом и желтым фоном. Код стиля для представления полужирного текста 2 . Цветовые коды для красного текста переднего плана 31 и 43 для желтого фона. Итак, имея это в виду, синтаксис для представления этого макета таков:

print('\033[2;31;43m CHEESY')

Выполните приведенную выше команду в вашем интерпретаторе Python (или файле). Вы увидите этот вывод:

16 цветов - пример 1

Это не совсем так, наш дрянной текст перетекает на следующую строчку. Нам нужна точка сброса, чтобы остановить печать цветов. Это можно сделать, добавив \033[0;0m к строке как:

print('\033[2;31;43m CHEESY \033[0;0m')

Код \033[0;0m представляет собой шаблон сброса, который возвращает терминал обратно в исходную цветовую схему. Это обеспечит следующий результат:

16 цветов - пример 1

Выглядит гораздо лучше.

16 Цветов В Colorama – Это Встроенный модуль

Colorama-это пакет Python, который предоставляет методы печати цветного текста на Python. Он поддерживает только 16-цветовую схему. Модуль подготавливает Escape-последовательности ANSI для получения цветного текста. Давайте установим модуль с помощью pip :

$ pip install colorama

Мы рекомендуем вам установить его в виртуальной среде . После настройки давайте перейдем к печати цветного текста с помощью Colorama:

# colorama_demo.py
from colorama import init, Fore, Back, Style

# Initializes Colorama
init(autoreset=True)

print(Style.BRIGHT + Back.YELLOW + Fore.RED + "CHEESY")

Сначала мы импортируем функции: init() (для инициализации модуля и установки autoreset в True поэтому нам не нужно сбрасывать его вручную), Fore (Текстовый объект переднего плана), Back (Фоновый объект) и Style (Объект стиля). Каждый объект имеет свой собственный набор констант, которые могут быть вызваны в функции print () .

Добавляя эти компоненты удобным для человека способом, Colorama преобразует такие значения, как YELLOW в 43 , для объекта Back , RED to 31 для объекта Fore и т. Д. Под капотом мы получаем последовательность ANSI, как и в прошлый раз, хотя нам не нужно знать коды самим – Colorama делает это за нас.

Шаблон сброса не требуется, так как мы установили аргумент autoreset в True при инициализации экземпляра.

Запуск кода покажет это:

Colorama - пример

256 Цветов в Raw Python

С развитием технологий 256-цветовая схема наиболее часто встречается в терминалах. Если вы используете ОС на базе Linux, вы можете проверить цветовую схему, поддерживаемую терминалом, введя следующую команду:

$ echo $TERM

Если эта команда возвращает xterm-256color , то ваш терминал поддерживает максимум 256 цветов.

Интересно, что это за цвета?

Мы можем погрузиться сразу после того, как поймем синтаксис 256-цветовой схемы. Работа с 256 цветами немного отличается от работы с 16-цветовой схемой:

256 цветов - синтаксис

Есть заполнитель, чтобы определить, будет ли цвет применен к тексту или фону; 38;5; – для текста и 48;5; – для фона. За этим следует цветовой код в диапазоне от 0 чтобы 255 .

Основываясь на приведенном выше синтаксисе, давайте попробуем воссоздать логотип Stack Abuse в Python с помощью Escape-последовательности ANSI.

Логотип содержит бледно-серый фон ( \033[48;5;236 м ) со словами: Застрял в белом ( \033[38;5;231m ) и Злоупотребление в оранжевом цвете ( \033[38;5;208м ). И конечно, код сброса должен быть встроен в строку.

Тем не менее, мы можем воссоздать логотип с помощью этой последовательности ANSI:

>>> print("\033[48;5;236m\033[38;5;231mStack \033[38;5;208mAbuse\033[0;0m")

Это приводит к:

Логотип Stack Abuse - в цвете

Потрясающе! Какие еще цвета может печатать терминал? Давайте посмотрим, напечатав все 256 цветов, поддерживаемых терминалом:

# colorspep8.py
def colors_16(color_):
    return("\033[2;{num}m {num} \033[0;0m".format(num=str(color_)))


def colors_256(color_):
    num1 = str(color_)
    num2 = str(color_).ljust(3, ' ')
    if color_ % 16 == 0:
        return(f"\033[38;5;{num1}m {num2} \033[0;0m\n")
    else:
        return(f"\033[38;5;{num1}m {num2} \033[0;0m")

print("The 16 colors scheme is:")
print(' '.join([colors_16(x) for x in range(30, 38)]))
print("\nThe 256 colors scheme is:")
print(' '.join([colors_256(x) for x in range(256)]))

Этот сценарий содержит две функции, которые печатают переменную, которую вы передаете в них, в соответствующих Escape-последовательностях ANSI. Как только мы запустим скрипт и передадим x в определенном диапазоне, например (30,38] для 16-цветовой схемы или (0-255] для 256-цветовой схемы, он распечатает индексы в цветах при этих значениях.

Это позволит распечатать обе цветовые схемы в терминале:

Логотип Stack Abuse - в цвете

Это может быть очень полезно в качестве краткого руководства при создании утилит командной строки.

Вывод

В этом уроке мы рассмотрели, как печатать цветные выходные данные для символов, которые мы отправляем в поток stdout . Мы изучили, как это сделать с помощью встроенных функций Python, а также как использовать библиотеку Colorama.