Как напечатать цветной текст в терминале в Python?


2132

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


7
Вы должны указать некоторую дополнительную информацию, чтобы получить лучшие ответы: мультиплатформенность? внешние модули принимаются?
Сорин

2
IPython делает это, кросс-платформенный. Видишь, что они используют?
эндолит

Этот символ создал бы большой цветной блок: единственная проблема в том, что он расширен ASCII, возможно, вы могли бы заставить его работать, используяhttp://stackoverflow.com/questions/8465226/using-extended-ascii-codes-with-python
Samy Bencherif

Некоторые терминалы также могут отображать символы Юникода. Если это верно для вашего терминала, возможные символы практически неограниченны.
айке

4
Этот ответ пришел довольно поздно, но мне кажется, что он лучший ... для тех, кто проголосовал выше, требуются специальные хаки для Windows, а этот просто работает: stackoverflow.com/a/3332860/901641
ArtOfWarfare

Ответы:


1836

Это в некоторой степени зависит от того, на какой платформе вы находитесь. Наиболее распространенный способ сделать это - распечатать 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)

или с Python3.6 +:

print(f"{bcolors.WARNING}Warning: No active frommets remain. Continue?{bcolors.ENDC}")

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

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

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

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

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

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


Но предположим, что мое приглашение по умолчанию не черное - как вы думаете, возможно ли сделать python resotre после этих уловок?
Adobe

4
В Linux вы можете захотеть использовать tput, например, так как это приводит к более переносимому коду.
Мартин Юдинг

3
@Cawas: реальный вариант использования disable- когда вы передаете вывод в файл; в то время как подобные инструменты catмогут поддерживать цвета, обычно лучше не печатать информацию о цвете в файлы.
Себастьян Мах

1
@AlexanderSimko, вот ctypes фрагмент кода , чтобы включить поддержку VT100 в Windows 10: import ctypes; kernel32 = ctypes.WinDLL('kernel32'); hStdOut = kernel32.GetStdHandle(-11); mode = ctypes.c_ulong(); kernel32.GetConsoleMode(hStdOut, ctypes.byref(mode)); mode.value |= 4; kernel32.SetConsoleMode(hStdOut, mode).
Eryk Sun

1
Всем, кто использует пример кода Python из ответа: следует отметить, что цвета в диапазоне 90-97 и 100-107 не являются стандартными и, действительно, на моем терминале не все они дают цвета, обозначенные имена переменных. Лучше использовать стандартные диапазоны 30-37 и 40-47. Источник: en.wikipedia.org/wiki/…
балу

807

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

from termcolor import colored

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

Или в Python 3:

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

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


2
Так как он генерирует коды ANSI, работает ли он на Windows (консоли DOS), если загружен ansi.sys? support.microsoft.com/kb/101875
Фил П

37
Просто заметил, что по состоянию на 01.01.2011 г. он сейчас под лицензией MIT
Александр Цепков

12
не имеет юнит-тестов (в отличие от колорамы) и не обновляется с 2011 года
Janus Troelsen

5
termcolor.COLORSдает вам список цветов
akxlr

23
os.system('color')Сначала запустите Windows , затем начнут работать escape-последовательности ANSI.
Сабольч

717

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

Пример экрана Python 3.6: пример скриншота


317
Как автор Colorama, спасибо за упоминание @ nbv4. Я постараюсь пояснить немного: Colorama стремится позволить программам на Python печатать цветной терминальный текст на всех платформах, используя те же коды ANSI, которые описаны во многих других ответах на этой странице. В Windows Colorama удаляет эти символы ANSI из стандартного вывода и преобразует их в эквивалентные вызовы win32 для цветного текста. На других платформах Colorama ничего не делает. Следовательно, вы можете использовать коды ANSI или такие модули, как Termcolor, а с Colorama они «просто работают» на всех платформах. Во всяком случае, это идея?
Джонатан Хартли

2
@Jonathan, это действительно потрясающая библиотека! Возможность кроссплатформенного цветного вывода Python действительно хороша и полезна. Я предоставляю инструменты для библиотеки, которая окрашивает свою консоль. Я могу перенаправить вывод этой консоли на терминал и раскрасить вывод. Теперь я могу даже создать библиотеку и позволить пользователю выбирать цвета. Это позволит дальтоникам заставить вещи работать так, чтобы они могли действительно видеть результат правильно. Спасибо
Demolishun

50
Это должно быть в стандартной библиотеке ... Поддержка межплатформенного цвета важна, я думаю.
daviewales

5
Колорама великолепна! Также взгляните на ansimarkup , который построен на колораме и позволяет использовать простую разметку на основе тегов (например <b>bold</b>) для добавления стиля к терминальному тексту
gvalkov

30
Это не работает без вызова colorama.init (). Проголосуй!
Смит Джонт

428

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

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

Пример успеха на зеленом фоне

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

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()

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

введите описание изображения здесь

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

верхняя часть вывода


8
это работает в большинстве оболочек, а также в ipython, достаточно для большинства приложений
dashesy

4
могу я спросить, какой это терминал?
FlipTack

4
насколько это портативно?
Руджеро Турра

2
Краткая автономная реализация: gist.github.com/Sheljohn/68ca3be74139f66dbc6127784f638920
Джонатан Х

203

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

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

Это производит следующее bash, в urxvtс цветовой гаммой Zenburn стиля:

выходные цвета

Экспериментально мы можем получить больше цветов:

цветовая матрица

Примечание: \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

2
как ты заставил txt мигать
WiLL_K

2
Какая оболочка или терминал заставляет его мигать?
Zypps987

1
(u) rxvt, например
qubodup

6
Мигающий текст работает очень хорошо. Как мне это остановить? Все последовательные отпечатки по какой-то причине мигают. Мой терминал думает, что пришло время вечеринки!
капитан

3
В конце строки мигать, поставить \33[0mили CENDвыше.
Stiffy2000

94

Вы хотите узнать о 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")

3
Попробуй def d(*v): return '\x1B['+';'.join(map(str, v))+'m'тогдаprint ' '.join([d(k,i)+str(i%10)+d(0) for i in range(30,38)+range(40,48) for k in range(2)])
Евгений Сергеев

в чем смысл сброса здесь?
MohitC

72

Я отвечаю, потому что я нашел способ использовать коды ANSI в Windows 10, чтобы вы могли изменить цвет текста без каких-либо встроенных модулей:

Строка, которая делает эту работу os.system(""), или любой другой системный вызов, который позволяет вам печатать коды ANSI в Терминале:

import os

os.system("")

# Group of Different functions for different styles
class style():
    BLACK = '\033[30m'
    RED = '\033[31m'
    GREEN = '\033[32m'
    YELLOW = '\033[33m'
    BLUE = '\033[34m'
    MAGENTA = '\033[35m'
    CYAN = '\033[36m'
    WHITE = '\033[37m'
    UNDERLINE = '\033[4m'
    RESET = '\033[0m'

print(style.YELLOW + "Hello, World!")

Примечание. Хотя это дает те же параметры, что и другие параметры Windows, Windows не полностью поддерживает коды ANSI, даже с этим приемом. Не все цвета оформления текста работают, и все «яркие» цвета (коды 90–97 и 100–107) отображаются так же, как обычные цвета (коды 30–37 и 40–47)

редактировать : Спасибо @jl за поиск еще более короткого метода.

tl; dr : добавитьos.system("") начало вашего файла.

Версия Python: 3.6.7


2
Это работает - я действительно удивлен тем, что команда color включает коды ANSI в терминале Windows, я годами не знал, что это возможно - сама команда не дает никакой подсказки, что она это делает.
Стюарт Аксон

1
Самый простой и отлично работает. Спасибо.
Ари

3
Чтобы было ясно, это будет работать только на Windows 10.
Anaksunaman

2
Не работает в Windows 7 / 8.1.
Никос

2
Большое спасибо за ваш ответ, @SimpleBinary! Играя с вашим ответом, я обнаружил, что вы можете упростить if sys.platform.lower() == "win32": os.system('color')еще больше, просто заменив его просто os.system(''). Никаких условий не требуется, и код работает как в Windows 10, так и в Linux (когда я его тестировал). Как видите, вам не нужно делать системный вызов color. Звонки dir, cd, abcdefи просто пустая строка отлично работает (хотя не пустые строки, скорее всего , печать вывод , который вы не хотите видеть).
JL

60

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

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-последовательности в вашем коде, оставаясь при этом лаконичным в использовании. Радоваться, веселиться!


65
Использование цвета в качестве имени функции, а не параметра является сомнительной практикой.
LtWorf

1
@LtWorf: вы можете легко сделать это параметром, используя, getattrесли вам это нужно. Или, скорее, просто создайте строку формата динамически.
JFS

8
@ То, что вы можете это сделать, не означает, что вы должны это делать. Это более универсально, если цвет является параметром, который вы можете просто передать.
15:00

2
Вы can just passфункция Python.
MaxNoe

2
Обратите внимание, что импорт благословений не работает на окнах, поэтому не используйте его, если ваш скрипт должен быть кроссплатформенным.
Adversus

58

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

Примеры:

from sty import fg, bg, ef, rs

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 custom colors:

from sty import Style, RgbFg

fg.orange = Style(RgbFg(255, 150, 50))

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

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

печатает:

введите описание изображения здесь

Демо-версия: введите описание изображения здесь


7
Было бы очень полезно, если бы вы сравнили его с колорамой, я бы предпочел вашу библиотеку, но только потому, что более короткие api из коробки, и было бы здорово, если бы она была более популярной. Спасибо!
Виктор Гавро

Мне нравится sty, и я пытаюсь отформатировать строку с помощью sty. Одна проблема заключается в том, что при печати нескольких цветов можно ли восстановить прежний цвет вместо цвета по умолчанию?
Intijk

@VictorGavro Это хорошая идея! Я могу добавить сравнение к документации.
Ротарети

@intijk Ваш вопрос не совсем подходит под раздел комментариев. Для такого рода вопросов, пожалуйста, создайте новый вопрос SO или используйте систему отслеживания проблем github.
Ротарети

53

сгенерировал класс со всеми цветами, используя цикл 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'

44

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

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")

19
Предложение: определите лямбда-выражения, которые возвращают эту цветную строку, вместо прямой печати, чтобы ее можно было использовать в сочетании с другими строками.
gustafbstrom

34

В Windows вы можете использовать модуль 'win32console' (доступный в некоторых дистрибутивах Python) или модуль 'ctypes' (Python 2.5 и выше) для доступа к Win32 API.

Чтобы увидеть полный код, который поддерживает оба способа, см. Код отчетности цветовой консоли от Testoob .

Пример ctypes:

import ctypes

# Constants from the Windows API
STD_OUTPUT_HANDLE = -11
FOREGROUND_RED    = 0x0004 # text color contains red.

def get_csbi_attributes(handle):
    # Based on IPython's winconsole.py, written by Alexander Belchenko
    import struct
    csbi = ctypes.create_string_buffer(22)
    res = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(handle, csbi)
    assert res

    (bufx, bufy, curx, cury, wattr,
    left, top, right, bottom, maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw)
    return wattr


handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
reset = get_csbi_attributes(handle)

ctypes.windll.kernel32.SetConsoleTextAttribute(handle, FOREGROUND_RED)
print "Cherry on top"
ctypes.windll.kernel32.SetConsoleTextAttribute(handle, reset)

2
Честно говоря, это единственное решение, которое работает с окнами. Все остальные ответы являются просто копией друг друга.
Данило

FWIW, в Windows может быть меньше проблем с использованием ConEmu, который поддерживает последовательности ANSI (кроме множества других преимуществ по сравнению с собственным терминалом). Все же здорово иметь собственное решение, хотя.
Endre Both

Я с Данилой.
Мухаммед Али

24

Тупо просто, основываясь на ответе @ joeld

class PrintInColor:
    RED = '\033[91m'
    GREEN = '\033[92m'
    YELLOW = '\033[93m'
    LIGHT_PURPLE = '\033[94m'
    PURPLE = '\033[95m'
    END = '\033[0m'

    @classmethod
    def red(cls, s, **kwargs):
        print(cls.RED + s + cls.END, **kwargs)

    @classmethod
    def green(cls, s, **kwargs):
        print(cls.GREEN + s + cls.END, **kwargs)

    @classmethod
    def yellow(cls, s, **kwargs):
        print(cls.YELLOW + s + cls.END, **kwargs)

    @classmethod
    def lightPurple(cls, s, **kwargs):
        print(cls.LIGHT_PURPLE + s + cls.END, **kwargs)

    @classmethod
    def purple(cls, s, **kwargs):
        print(cls.PURPLE + s + cls.END, **kwargs)

Тогда просто

PrintInColor.red('hello', end=' ')
PrintInColor.green('world')

2
Это приведет к сбою, если вы передадите более одного позиционного аргумента или что-либо, кроме строкового типа
Romain Vincent

@RomainVincent Тогда не передавайте более одного позиционного аргумента или что-либо, кроме строки ty - подождите, это print-замены ? Возражение снято.
wizzwizz4

1
@ wizzwizz4 Я не уверен, что вы имели в виду с этим комментарием, я все равно не вижу смысла. Если вы собираетесь предложить класс ..., чтобы заменить метод так же просто, как print, вы также можете не делать его так легко взломать. Просто мое мнение.
Ромен Винсент

1
@RomainVincent Я собирался сказать, что ваше возражение было неправильным, но для замены функции настолько универсальной, насколько printэто необходимо, для правильной репликации ее функциональности.
wizzwizz4

1
@RomainVincent Реализует использование бесконечных аргументов: <code> def purple(cls, *args, **kwargs): print(cls.PURPLE, *args, cls.END, **kwargs)</ code>
Эмильен Боде,

23

Я обернул ответ @joeld в модуль с глобальными функциями, которые я могу использовать в любом месте моего кода.

файл: log.py

HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = "\033[1m"

def disable():
    HEADER = ''
    OKBLUE = ''
    OKGREEN = ''
    WARNING = ''
    FAIL = ''
    ENDC = ''

def infog( msg):
    print OKGREEN + msg + ENDC

def info( msg):
    print OKBLUE + msg + ENDC

def warn( msg):
    print WARNING + msg + ENDC

def err( msg):
    print FAIL + msg + ENDC

использовать следующим образом:

 import log
    log.info("Hello World")
    log.err("System Error")

22

Для Windows вы не можете печатать на консоли с цветами, если вы не используете win32api.

Для Linux это так же просто, как использовать print, с escape-последовательностями, описанными здесь:

Цвета

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

#

21
# Pure Python 3.x demo, 256 colors
# Works with bash under Linux and MacOS

fg = lambda text, color: "\33[38;5;" + str(color) + "m" + text + "\33[0m"
bg = lambda text, color: "\33[48;5;" + str(color) + "m" + text + "\33[0m"

def print_six(row, format, end="\n"):
    for col in range(6):
        color = row*6 + col - 2
        if color>=0:
            text = "{:3d}".format(color)
            print (format(text,color), end=" ")
        else:
            print(end="    ")   # four spaces
    print(end=end)

for row in range(0, 43):
    print_six(row, fg, " ")
    print_six(row, bg)

# Simple usage: print(fg("text", 160))

Текст с изменением переднего плана и фона, цвета 0..141 Текст с изменением переднего плана и фона, цвета 142..255


20

Я закончил тем, что делал это, я чувствовал, что это было самым чистым:

formatters = {             
    'RED': '\033[91m',     
    'GREEN': '\033[92m',   
    'END': '\033[0m',      
}

print 'Master is currently {RED}red{END}!'.format(**formatters)
print 'Help make master {GREEN}green{END} again!'.format(**formatters)

Это действительно хорошо делать без стороннего пакета.
Джейми Counsell

20

Опираясь на ответ @joeld, используя https://pypi.python.org/pypi/lazyme pip install -U lazyme :

from lazyme.string import color_print
>>> color_print('abc')
abc
>>> color_print('abc', color='pink')
abc
>>> color_print('abc', color='red')
abc
>>> color_print('abc', color='yellow')
abc
>>> color_print('abc', color='green')
abc
>>> color_print('abc', color='blue', underline=True)
abc
>>> color_print('abc', color='blue', underline=True, bold=True)
abc
>>> color_print('abc', color='pink', underline=True, bold=True)
abc

Скриншот:

введите описание изображения здесь


Некоторые обновления color_printс новыми форматерами, например:

>>> from lazyme.string import palette, highlighter, formatter
>>> from lazyme.string import color_print
>>> palette.keys() # Available colors.
['pink', 'yellow', 'cyan', 'magenta', 'blue', 'gray', 'default', 'black', 'green', 'white', 'red']
>>> highlighter.keys() # Available highlights.
['blue', 'pink', 'gray', 'black', 'yellow', 'cyan', 'green', 'magenta', 'white', 'red']
>>> formatter.keys() # Available formatter, 
['hide', 'bold', 'italic', 'default', 'fast_blinking', 'faint', 'strikethrough', 'underline', 'blinking', 'reverse']

Примечание: italic, fast blinkingиstrikethrough не может работать на всех терминалах, не работает на Mac / Ubuntu.

Например

>>> color_print('foo bar', color='pink', highlight='white')
foo bar
>>> color_print('foo bar', color='pink', highlight='white', reverse=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', bold=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', faint=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', faint=True, reverse=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', underline=True, reverse=True)
foo bar

Скриншот:

введите описание изображения здесь


20
def black(text):
    print('\033[30m', text, '\033[0m', sep='')

def red(text):
    print('\033[31m', text, '\033[0m', sep='')

def green(text):
    print('\033[32m', text, '\033[0m', sep='')

def yellow(text):
    print('\033[33m', text, '\033[0m', sep='')

def blue(text):
    print('\033[34m', text, '\033[0m', sep='')

def magenta(text):
    print('\033[35m', text, '\033[0m', sep='')

def cyan(text):
    print('\033[36m', text, '\033[0m', sep='')

def gray(text):
    print('\033[90m', text, '\033[0m', sep='')


black("BLACK")
red("RED")
green("GREEN")
yellow("YELLOW")
blue("BLACK")
magenta("MAGENTA")
cyan("CYAN")
gray("GRAY")

Попробуй онлайн


Это только для python3? получил ошибку в sep = '' с python2
ScipioAfricanus

отлично работает в Python3 Ubuntu 18.04
Юлиус Прайого

18

обратите внимание, насколько хорошо withключевое слово смешивается с такими модификаторами, которые необходимо сбросить (используя Python 3 и Colorama):

from colorama import Fore, Style
import sys

class Highlight:
  def __init__(self, clazz, color):
    self.color = color
    self.clazz = clazz
  def __enter__(self):
    print(self.color, end="")
  def __exit__(self, type, value, traceback):
    if self.clazz == Fore:
      print(Fore.RESET, end="")
    else:
      assert self.clazz == Style
      print(Style.RESET_ALL, end="")
    sys.stdout.flush()

with Highlight(Fore, Fore.GREEN):
  print("this is highlighted")
print("this is not")

Пробовал колораму, использовал print(Style.BRIGHT + "Header Test")и print (Style.DIM + word)для создания действительно приятного приглашения.
Том

Это нужно изменить, чтобы использовать contextlibдля Py3.
кошка

@cat: С какой версии Python это будет необходимо?
Янус Троелсен

Я верю 3 и выше - на нем должен быть @contextlib.contextmanagerдекоратор, нет?
кот

1
@cat: почему? Отлично работает без.
Янус Троелсен

17

Вы можете использовать Python-реализацию библиотеки curses: http://docs.python.org/library/curses.html

Кроме того, запустите это, и вы найдете свой ящик:

for i in range(255):
    print i, chr(i)

Лично я думаю, что библиотека «проклятий» полностью затмила «благословения», точно так же, как «запросы» затмили «urllib» и т. Д.
Джонатан Хартли

17

Вы можете использовать CLINT:

from clint.textui import colored
print colored.red('some warning message')
print colored.green('nicely done!')

Получите это от GitHub .


1
Первая ссылка исчезла, поэтому я удалил ее; ссылка GH все еще хороша (хотя проект "заархивирован" и в основном заброшен, из того, что я могу собрать).
Джакомо Лакава

15

Я знаю, что я опоздал. Но у меня есть библиотека под названием ColorIt . Это супер просто.

Вот некоторые примеры:

from ColorIt import *

# Use this to ensure that ColorIt will be usable by certain command line interfaces
initColorIt()

# Foreground
print (color ('This text is red', colors.RED))
print (color ('This text is orange', colors.ORANGE))
print (color ('This text is yellow', colors.YELLOW))
print (color ('This text is green', colors.GREEN))
print (color ('This text is blue', colors.BLUE))
print (color ('This text is purple', colors.PURPLE))
print (color ('This text is white', colors.WHITE))

# Background
print (background ('This text has a background that is red', colors.RED))
print (background ('This text has a background that is orange', colors.ORANGE))
print (background ('This text has a background that is yellow', colors.YELLOW))
print (background ('This text has a background that is green', colors.GREEN))
print (background ('This text has a background that is blue', colors.BLUE))
print (background ('This text has a background that is purple', colors.PURPLE))
print (background ('This text has a background that is white', colors.WHITE))

# Custom
print (color ("This color has a custom grey text color", (150, 150, 150))
print (background ("This color has a custom grey background", (150, 150, 150))

# Combination
print (background (color ("This text is blue with a white background", colors.BLUE), colors.WHITE))

Это дает вам:

Изображение ColorIt

Стоит также отметить, что это кроссплатформенное приложение, протестированное на Mac, Linux и Windows.

Вы можете попробовать это: https://github.com/CodeForeverAndEver/ColorIt

Примечание. Мигание, курсив, полужирный и т. Д. Будут добавлены через несколько дней.


14

Если вы программируете игру, возможно, вы хотели бы изменить цвет фона и использовать только пробелы? Например:

print " "+ "\033[01;41m" + " " +"\033[01;46m"  + "  " + "\033[01;42m"

Подробнее об этом можно прочитать здесь
прагматично

11

Если вы используете Windows, то здесь вы идете!

# display text on a Windows console
# Windows XP with Python27 or Python32
from ctypes import windll
# needed for Python2/Python3 diff
try:
    input = raw_input
except:
    pass
STD_OUTPUT_HANDLE = -11
stdout_handle = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
# look at the output and select the color you want
# for instance hex E is yellow on black
# hex 1E is yellow on blue
# hex 2E is yellow on green and so on
for color in range(0, 75):
     windll.kernel32.SetConsoleTextAttribute(stdout_handle, color)
     print("%X --> %s" % (color, "Have a fine day!"))
     input("Press Enter to go on ... ")

Если вы хотите использовать разные цвета в одной строке, очистите поток stdout между вызовами:print("%X --> %s" % (color, "Have a fine day!"), end='', flush=True)
user2023861

11

Если вы используете Django

>>> from django.utils.termcolors import colorize
>>> print colorize("Hello World!", fg="blue", bg='red',
...                 opts=('bold', 'blink', 'underscore',))
Hello World!
>>> help(colorize)

снимок:

образ

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

Вы можете проверить, установлен ли он на вашем компьютере:
$ python -c "import django; print django.VERSION"
Чтобы установить его, проверьте: Как установить Django

Попробуйте!


10

Вот пример проклятия:

import curses

def main(stdscr):
    stdscr.clear()
    if curses.has_colors():
        for i in xrange(1, curses.COLORS):
            curses.init_pair(i, i, curses.COLOR_BLACK)
            stdscr.addstr("COLOR %d! " % i, curses.color_pair(i))
            stdscr.addstr("BOLD! ", curses.color_pair(i) | curses.A_BOLD)
            stdscr.addstr("STANDOUT! ", curses.color_pair(i) | curses.A_STANDOUT)
            stdscr.addstr("UNDERLINE! ", curses.color_pair(i) | curses.A_UNDERLINE)
            stdscr.addstr("BLINK! ", curses.color_pair(i) | curses.A_BLINK)
            stdscr.addstr("DIM! ", curses.color_pair(i) | curses.A_DIM)
            stdscr.addstr("REVERSE! ", curses.color_pair(i) | curses.A_REVERSE)
    stdscr.refresh()
    stdscr.getch()

if __name__ == '__main__':
    print "init..."
    curses.wrapper(main)

Ваш код не работает под Windows (x64) с этой ошибкой: AttributeError: у объекта 'module' нет атрибута 'wrapper'
sorin

1
@Sorin Sbarnea: В соответствии с официальной документацией python curses в docs.python.org/library/curses.html , модуль curses не поддерживается в Windows. Возможно, вы получили эту ошибку вместо «Нет такого модуля» или что-то в этом роде, потому что вы, вероятно, назвали свой тестовый файл «curses.py», поэтому он импортирует сам себя.
Носкло

10

https://raw.github.com/fabric/fabric/master/fabric/colors.py

"""
.. versionadded:: 0.9.2

Functions for wrapping strings in ANSI color codes.

Each function within this module returns the input string ``text``, wrapped
with ANSI color codes for the appropriate color.

For example, to print some text as green on supporting terminals::

    from fabric.colors import green

    print(green("This text is green!"))

Because these functions simply return modified strings, you can nest them::

    from fabric.colors import red, green

    print(red("This sentence is red, except for " + \
          green("these words, which are green") + "."))

If ``bold`` is set to ``True``, the ANSI flag for bolding will be flipped on
for that particular invocation, which usually shows up as a bold or brighter
version of the original color on most terminals.
"""


def _wrap_with(code):

    def inner(text, bold=False):
        c = code
        if bold:
            c = "1;%s" % c
        return "\033[%sm%s\033[0m" % (c, text)
    return inner

red = _wrap_with('31')
green = _wrap_with('32')
yellow = _wrap_with('33')
blue = _wrap_with('34')
magenta = _wrap_with('35')
cyan = _wrap_with('36')
white = _wrap_with('37')

10

asciimatics предоставляет портативную поддержку для создания текстового интерфейса и анимации:

#!/usr/bin/env python
from asciimatics.effects import RandomNoise  # $ pip install asciimatics
from asciimatics.renderers import SpeechBubble, Rainbow
from asciimatics.scene import Scene
from asciimatics.screen import Screen
from asciimatics.exceptions import ResizeScreenError


def demo(screen):
    render = Rainbow(screen, SpeechBubble('Rainbow'))
    effects = [RandomNoise(screen, signal=render)]
    screen.play([Scene(effects, -1)], stop_on_resize=True)

while True:
    try:
        Screen.wrapper(demo)
        break
    except ResizeScreenError:
        pass

Asciicast:

текст цвета радуги среди шума ascii


10

Еще один модуль pypi, который включает функцию печати python 3:

https://pypi.python.org/pypi/colorprint

Это можно использовать в Python 2.x, если вы тоже from __future__ import print. Вот пример Python 2 со страницы Pypi для модулей:

from __future__ import print_function
from colorprint import *

print('Hello', 'world', color='blue', end='', sep=', ')
print('!', color='red', format=['bold', 'blink'])

Выходы "Привет, мир!" со словами в синем и восклицательным знаком, выделенным красным и мигающим.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.