Как покрасить отдельные символы в Python
Делаю скрипт, который отправляет погоду. Чтобы все было красиво решил добавить иконку погоды в стиле ascii-art. Вроде сделал, но нужно покрасить солнышко в желтый, а облако оставить белым. Пытаюсь сделать через colorama, но он красит мне пол солнца, а остальное не красит. Вот код:
print(r' \ ___ / ')
print(r' .--./ \ __ ')
print(r' .-( )___/ ' )
print(r' (___.__.____)\ ')
Как покрасить солнце в желтый, а облако оставить белым?
Ответы (1 шт):
Если коротко: перед выводом символа выводить нужный цвет (или как минимум выводить цвет, если цвет не совпадает с цветом предыдущих символов).
Идея такая: дополнительно к текстовой картинке облака делаем текстовую картинку, в которой разными буквами обозначены разные цвета, параллельно посимвольно читаем обе текстовые строки, меняем цвет в соответствии с символом из второй строки, потом выводим символ из первой строки.
Все примерно как в этом ответе, только там каждый символ картинки сам задавал свой цвет:
Как задать всем символам 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), но когда строчки внутри текста разной длины, цвета начинают смещаться, а с разбивкой на отдельные строки проще контролировать соответствие цветов символам на картинке.
Результат:
