Как покрасить отдельные символы в Python

Делаю скрипт, который отправляет погоду. Чтобы все было красиво решил добавить иконку погоды в стиле ascii-art. Вроде сделал, но нужно покрасить солнышко в желтый, а облако оставить белым. Пытаюсь сделать через colorama, но он красит мне пол солнца, а остальное не красит. Вот код:

print(r'          \ ___ /  ')
print(r'       .--./   \ __ ')
print(r'    .-(    )___/ ' )
print(r'   (___.__.____)\ ')

Как покрасить солнце в желтый, а облако оставить белым?


Ответы (1 шт):

Автор решения: insolor

Если коротко: перед выводом символа выводить нужный цвет (или как минимум выводить цвет, если цвет не совпадает с цветом предыдущих символов).

Идея такая: дополнительно к текстовой картинке облака делаем текстовую картинку, в которой разными буквами обозначены разные цвета, параллельно посимвольно читаем обе текстовые строки, меняем цвет в соответствии с символом из второй строки, потом выводим символ из первой строки.

Все примерно как в этом ответе, только там каждый символ картинки сам задавал свой цвет:
Как задать всем символам x черный цвет, y - зеленый, z - красный, i - желтый?

Пример кода:

import itertools

import colorama
from colorama import Fore, Style


colorama.init()

cloud = r"""
          \ ___ /
       .--./   \ __
    .-(    )___/
   (___.__.____)\
""".splitlines()[1:]

# Изначально скопировал текст облака, потом каждый символ заменил на символ цвета (Y будет желтым, W - белым)
colors = """
          Y YYY Y
       WWWWY   Y YY
    WWW    WWWWY
   WWWWWWWWWWWWWY
""".splitlines()[1:]

# Задаем соответствие, что Y будем менять на желтый цвет, W - на белый
color_map = {
    'Y': Style.BRIGHT + Fore.YELLOW,
    'W': Style.BRIGHT + Fore.WHITE
}

prev_color = Style.NORMAL + Fore.WHITE
print(prev_color, end='')
for image_line, color_line in zip(cloud, colors):
    for symbol, color_char in itertools.zip_longest(image_line, color_line, fillvalue=''):
        color = color_map.get(color_char)
        # Если символу соответствует какой-то цвет, и цвет не совпадает с предыдущим цветом, то меняем цвет
        if color and color != prev_color:
            prev_color = color
            print(color, end='')
        
        print(symbol, end='')
    print()

print(Style.RESET_ALL, end='')

Изначально делал просто две текстовые строки, а не два списка строк (не разбивал строки с помощью splitlines), но когда строчки внутри текста разной длины, цвета начинают смещаться, а с разбивкой на отдельные строки проще контролировать соответствие цветов символам на картинке.

Результат:

Результат

→ Ссылка