Colorama не выдает цвет текста, а пишет символы вокруг него

Рейтинг: 0Ответов: 1Опубликовано: 19.03.2023

Вот мой вывод: введите сюда описание изображения

Собственно, по коду он должен сделать текст TESTED внутри жирным красным, но этого не происходит и я не понимаю почему.

Мой код:

import os
import random
import time
import wcwidth
import curses
import colorama


# Считываем файл
with open("text.txt", "r") as input_file:
    heart_text = input_file.read()

# Разбиваем строку на список строк
heart_lines = heart_text.split('\n')

# Изменяем размер арта, если он не помещается на экран
console_size = os.get_terminal_size()
if len(heart_lines) > console_size.lines:
    heart_lines = heart_lines[:console_size.lines]

# Определяем размер консоли и создаем окно curses
stdscr = curses.initscr()
max_y, max_x = stdscr.getmaxyx()
win = curses.newwin(max_y, max_x, 0, 0)

# Обрезаем 7-ую строку, если она длиннее 23 символов
if len(heart_lines[7]) > 19:
    heart_lines[7] = heart_lines[7][:19]

# Заменяем символы сердечка на другие символы
symbols = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890" # добавьте сюда свои символы
new_heart_lines = []
counter = 0  # счетчик циклов

while counter < 100:
    new_heart_lines = []
    for i, line in enumerate(heart_lines):
        new_line = ""
        for j, char in enumerate(line):
            if i == 7 and j in range(10,11):
                new_line += colorama.Fore.RED + colorama.Style.BRIGHT + "TESTED" + colorama.Style.RESET_ALL
            elif char == "*":
                weights = [0.05] * len(symbols)
                weights[symbols.index('0')] = 0.3  # вероятность выбора 0 равна 0.3
                weights[symbols.index('1')] = 0.2  # вероятность выбора 1 равна 0.2
                new_char = random.choices(symbols, weights=weights)[0]
                new_line += new_char
            else:
                new_line += char
        new_heart_lines.append(new_line)

    # Выводим измененный арт в окно curses
    for y, line in enumerate(new_heart_lines):
        for x, char in enumerate(line):
            win.addstr(y, x, char)

    # Обновляем окно curses
    win.refresh()

    counter += 1  # увеличиваем счетчик циклов

    if counter >= 50:
        break

    time.sleep(0.1)  # пауза в x секунды после каждого цикла вывода

# Завершаем работу с библиотекой curses
curses.endwin()

Я использую библиотеку curses-windows для динамического обновления терминала, т.к. сердце обновляется на рандомные символы из symbols каждое время (0.1 сек), текст TESTED статичный и не меняется.

Ответы

▲ 1Принят

Windows-curses не поддерживает изменение цветов через colorama при использовании динамического обновления консоли в библиотеке. Я использовал

curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK)

А затем указывал цвет при помощи

    for y, line in enumerate(new_heart_lines):
    for x, char in enumerate(line):
        if char in name:
            win.attron(curses.color_pair(1))
        else:
            win.attroff(curses.color_pair(1))
        win.addstr(y, x, char)

Предварительно поместив нужный текст в name, поменял сам текст на русский язык, т.к. генерируются рандомные символы в этом арте, из за чего подсвечиваются и они, но, думаю, это можно исправить проверками на строку и символы