Цветной текст в IDLE оболочке на Python

Я искал на оригинальном SOF (ссылка внизу статьи), как сделать цветным текст в оболочке IDLE. Меня не устраивает, что функцию color.write(YourText,Color) долго писать (я собирался позднее часто использовать данную функцию).

Эта часть кода нужна для активации цветного текста:

import sys
try: color = sys.stdout.shell
except AttributeError: raise RuntimeError("Use IDLE")

И, собственно, цветной текст:

color.write('text','hit')

Я попробовал упростить её через def:

def cprint(text, color):
    text = str(text)
    color = str(color)
    color.write(text, color)
    color.write('\n')

cprint("text", 'hit')

При выполнении программы выходит AttributeError:

  File "C:\...\colortext.py", line 11, in <module>
    cprint("text", 'hit')
  File "C:\...\colortext.py", line 8, in cprint
    color.write(text, color)
AttributeError: 'str' object has no attribute 'write' 

Я пытался решить проблему самостоятельно, попытавшись обмануть Пайтон:

def cprint(text, color):
    color.write("%s" %text, "%s" %color)
    color.write('\n')

Но ничего не получилось ¯\_(ツ)_/¯

Я собирался потом импортировать этот файл как модуль, поэтому команды (по идее) должны быть короткими.

Заранее спасибо!

Ссылки:

Статья оригинального SOF'a - How do I print colored text in IDLE's terminal?


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

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

color из sys.stdout.shell не тоже самое, что color - второй аргумент функции.

def cprint(text, clr):
    colorText.write(str(text)+'\n', clr)


import sys
try: colorText = sys.stdout.shell
except AttributeError: raise RuntimeError("Use IDLE")

cprint("text", 'hit')
→ Ссылка
Автор решения: MarianD
import sys

def cprint(text, color):
    try:
        shell_stream = sys.stdout.shell
    except AttributeError:
        raise RuntimeError("Use IDLE")
    shell_stream.write(text, color)
    shell_stream.write('\n')

# Тесты:
cprint('Hello, world', 'KEYWORD')
cprint('How are you?', 'STRING')

Примечания:

  1. Не рекомендуют использовать глобальные переменные в определении функций, потому я вложил первую часть вашей программы прямо в неё.

  2. Писать try: color = sys.stdout.shell (и следующую строку вашей программы) в одной строке противоречит PEP 8 - руководству по написанию кода на Python, потому я написал эти строки как следует.

  3. Переменная color как параметр вашей функции перекрыла (побила) глобальную переменную с тем же самым именем, так что color в теле функции стала обычной строкой — потому возникла ваша ошибка.
    Я использовал имя shell_stream для объекта sys.stdout.shell.

  4. Команды

    text = str(text)
    color = str(color)
    

    я просто пропустил как излишние.

→ Ссылка