Как напечатать цветной текст в терминале в Python? - PullRequest
1768 голосов
/ 13 ноября 2008

Как вывести цветной текст на терминал в Python? Какой символ Unicode лучше всего представляет сплошной блок?

Ответы [ 38 ]

1533 голосов
/ 13 ноября 2008

Это зависит от того, на какой платформе вы находитесь. Наиболее распространенный способ сделать это - распечатать escape-последовательности ANSI. В качестве простого примера приведу код на Python из сценариев сборки blender :

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

Чтобы использовать такой код, вы можете сделать что-то вроде

print bcolors.WARNING + "Warning: No active frommets remain. Continue?" 
      + bcolors.ENDC

Это будет работать в Unix, включая OS X, Linux и Windows (при условии, что вы используете ANSICON , или в Windows 10 при условии, что вы включаете VT100 эмуляцию ). Есть ANSI коды для установки цвета, перемещения курсора и т. Д.

Если вы собираетесь усложниться с этим (и если вы пишете игру, это звучит так, как если бы вы писали), вам следует заглянуть в модуль «curses», который обрабатывает многие сложные части этого для вас. Python Curses HowTO - хорошее введение.

Если вы не используете расширенный ASCII (т.е. не на ПК), вы застряли с символами ascii ниже 127, и «#» или «@», вероятно, является вашей лучшей ставкой для блока. Если вы можете убедиться, что ваш терминал использует расширенный набор символов IBM ascii , у вас есть еще много вариантов. Символы 176, 177, 178 и 219 являются «блочными символами».

Некоторые современные текстовые программы, такие как «Dwarf Fortress», эмулируют текстовый режим в графическом режиме и используют изображения классического шрифта для ПК. Вы можете найти некоторые из этих растровых изображений, которые можно использовать на Dwarf Fortress Wiki см. ( пользовательских наборов плиток ).

В демонстрационном конкурсе в текстовом режиме имеется больше ресурсов для создания графики в текстовом режиме.

Хм .. Я думаю, что немного увлекся этим ответом. Хотя я планирую эпическую текстовую приключенческую игру. Удачи с вашим цветным текстом!

655 голосов
/ 16 ноября 2008

Я удивлен, что никто не упомянул модуль Python termcolor . Использование довольно просто:

from termcolor import colored

print colored('hello', 'red'), colored('world', 'green')

Или в Python 3:

print(colored('hello', 'red'), colored('world', 'green'))

Однако, он может быть недостаточно сложным для программирования игр и «цветных блоков», которые вы хотите делать ...

577 голосов
/ 26 июля 2010

Ответ Colorama для всех кроссплатформенных раскрасок в Python.

Пример экрана Python 3.6: example screenshot

352 голосов
/ 14 февраля 2014

Напечатайте строку, которая начинает цвет / стиль, затем строку, а затем завершите изменение цвета / стиля с помощью '\x1b[0m':

print('\x1b[6;30;42m' + 'Success!' + '\x1b[0m')

Success with green background example

Получить таблицу параметров формата для текста оболочки со следующим кодом:

def print_format_table():
    """
    prints table of formatted text format options
    """
    for style in range(8):
        for fg in range(30,38):
            s1 = ''
            for bg in range(40,48):
                format = ';'.join([str(style), str(fg), str(bg)])
                s1 += '\x1b[%sm %s \x1b[0m' % (format, format)
            print(s1)
        print('\n')

print_format_table()

Пример "свет в темноте" (завершено)

enter image description here

Пример темного освещения (частичный)

top part of output

136 голосов
/ 12 сентября 2016

Определите строку, начинающую цвет, и строку, оканчивающую цвет, затем напечатайте текст с начальной строкой впереди и конечной строкой в ​​конце.

CRED = '\033[91m'
CEND = '\033[0m'
print(CRED + "Error, does not compute!" + CEND)

Это дает следующее в bash, в urxvt с цветовой схемой в стиле Zenburn:

output colors

Благодаря экспертизе мы можем получить больше цветов:

color matrix

Примечание: \33[5m и \33[6m мигают.

Таким образом, мы можем создать полноцветную коллекцию:

CEND      = '\33[0m'
CBOLD     = '\33[1m'
CITALIC   = '\33[3m'
CURL      = '\33[4m'
CBLINK    = '\33[5m'
CBLINK2   = '\33[6m'
CSELECTED = '\33[7m'

CBLACK  = '\33[30m'
CRED    = '\33[31m'
CGREEN  = '\33[32m'
CYELLOW = '\33[33m'
CBLUE   = '\33[34m'
CVIOLET = '\33[35m'
CBEIGE  = '\33[36m'
CWHITE  = '\33[37m'

CBLACKBG  = '\33[40m'
CREDBG    = '\33[41m'
CGREENBG  = '\33[42m'
CYELLOWBG = '\33[43m'
CBLUEBG   = '\33[44m'
CVIOLETBG = '\33[45m'
CBEIGEBG  = '\33[46m'
CWHITEBG  = '\33[47m'

CGREY    = '\33[90m'
CRED2    = '\33[91m'
CGREEN2  = '\33[92m'
CYELLOW2 = '\33[93m'
CBLUE2   = '\33[94m'
CVIOLET2 = '\33[95m'
CBEIGE2  = '\33[96m'
CWHITE2  = '\33[97m'

CGREYBG    = '\33[100m'
CREDBG2    = '\33[101m'
CGREENBG2  = '\33[102m'
CYELLOWBG2 = '\33[103m'
CBLUEBG2   = '\33[104m'
CVIOLETBG2 = '\33[105m'
CBEIGEBG2  = '\33[106m'
CWHITEBG2  = '\33[107m'

Вот код для генерации теста:

x = 0
for i in range(24):
  colors = ""
  for j in range(5):
    code = str(x+j)
    colors = colors + "\33[" + code + "m\\33[" + code + "m\033[0m "
  print(colors)
  x=x+5
77 голосов
/ 13 ноября 2008

Вы хотите узнать о escape-последовательностях ANSI. Вот краткий пример:

CSI="\x1B["
print CSI+"31;40m" + "Colored Text" + CSI + "0m"

Подробнее см. http://en.wikipedia.org/wiki/ANSI_escape_code

Для символа блока попробуйте использовать символ Юникода, например, \ u2588:

print u"\u2588"

Собираем все вместе:

print CSI+"31;40m" + u"\u2588" + CSI + "0m"
59 голосов
/ 18 декабря 2011

Мой любимый способ - библиотека Blessings (полное раскрытие: я написал). Например:

from blessings import Terminal

t = Terminal()
print t.red('This is red.')
print t.bold_bright_red_on_black('Bright red on black')

Для печати цветных кубиков самый надежный способ - это печать пробелов фоновыми цветами. Я использую эту технику, чтобы нарисовать индикатор прогресса в прогрессивный нос :

print t.on_green(' ')

Вы также можете печатать в определенных местах:

with t.location(0, 5):
    print t.on_yellow(' ')

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

print '{t.clear_eol}You just cleared a {t.bold}whole{t.normal} line!'.format(t=t)

Приятной особенностью Blessings является то, что он старается работать на всех типах терминалов, а не только на (в подавляющем большинстве распространенных) цветовых ANSI. Он также сохраняет нечитаемые escape-последовательности в вашем коде, оставаясь при этом лаконичным в использовании. Веселись!

49 голосов
/ 19 октября 2014

сгенерировал класс со всеми цветами, используя цикл for для повторения каждой комбинации цветов до 100, а затем написал класс с цветами python. Скопируйте и вставьте, как вы, GPLv2 мной:

class colors:
    '''Colors class:
    reset all colors with colors.reset
    two subclasses fg for foreground and bg for background.
    use as colors.subclass.colorname.
    i.e. colors.fg.red or colors.bg.green
    also, the generic bold, disable, underline, reverse, strikethrough,
    and invisible work with the main class
    i.e. colors.bold
    '''
    reset='\033[0m'
    bold='\033[01m'
    disable='\033[02m'
    underline='\033[04m'
    reverse='\033[07m'
    strikethrough='\033[09m'
    invisible='\033[08m'
    class fg:
        black='\033[30m'
        red='\033[31m'
        green='\033[32m'
        orange='\033[33m'
        blue='\033[34m'
        purple='\033[35m'
        cyan='\033[36m'
        lightgrey='\033[37m'
        darkgrey='\033[90m'
        lightred='\033[91m'
        lightgreen='\033[92m'
        yellow='\033[93m'
        lightblue='\033[94m'
        pink='\033[95m'
        lightcyan='\033[96m'
    class bg:
        black='\033[40m'
        red='\033[41m'
        green='\033[42m'
        orange='\033[43m'
        blue='\033[44m'
        purple='\033[45m'
        cyan='\033[46m'
        lightgrey='\033[47m'
42 голосов
/ 23 декабря 2015

Попробуйте этот простой код

def prRed(prt): print("\033[91m {}\033[00m" .format(prt))
def prGreen(prt): print("\033[92m {}\033[00m" .format(prt))
def prYellow(prt): print("\033[93m {}\033[00m" .format(prt))
def prLightPurple(prt): print("\033[94m {}\033[00m" .format(prt))
def prPurple(prt): print("\033[95m {}\033[00m" .format(prt))
def prCyan(prt): print("\033[96m {}\033[00m" .format(prt))
def prLightGray(prt): print("\033[97m {}\033[00m" .format(prt))
def prBlack(prt): print("\033[98m {}\033[00m" .format(prt))

prGreen("Hello world")
33 голосов
/ 10 февраля 2018

sty похож на colorama, но он менее подробный, поддерживает 8bit и 24bit (rgb) цветов, позволяет регистрировать собственные цвета, действительно гибкий и хорошо документированный.

from sty import fg, bg, ef, rs, RgbFg

foo = fg.red + 'This is red text!' + fg.rs
bar = bg.blue + 'This has a blue background!' + bg.rs
baz = ef.italic + 'This is italic text' + rs.italic
qux = fg(201) + 'This is pink text using 8bit colors' + fg.rs
qui = fg(255, 10, 10) + 'This is red text using 24bit colors.' + fg.rs

# Add new colors:

fg.set_style('orange', RgbFg(255, 150, 50))

buf = fg.orange + 'Yay, Im orange.' + fg.rs

print(foo, bar, baz, qux, qui, buf, sep='\n')

печать:

enter image description here

Демо-версия: enter image description here

...