Как использовать цветовую палитру терминала с проклятиями

Я не могу заставить цветовую палитру терминала работать с проклятиями.

import curses

def main(stdscr):
    curses.use_default_colors()
    for i in range(0,7):
        stdscr.addstr("Hello", curses.color_pair(i))
    stdscr.getch()

curses.wrapper(main)

этот скрипт python дает следующий экран:

enter image description here

однако у меня есть больше цветов в моей палитре gnome-terminal. Как я могу получить доступ к ним через проклятия?

5 ответов


следующее я выяснил экспериментально на своем собственном ПК (Ubuntu 14.04, python 3).

  • существует 256 цветов (определенных первыми 8 битами).
  • другие биты используются для дополнительных атрибутов, таких как выделение.
  • передача числа -1 в качестве цвета возвращается к цветам фона и переднего плана по умолчанию.
  • цветовая пара 0 (mod 256) фиксируется на (-1, -1).
  • цвета 0 до 15 палитрой терминал цвета.

рассмотрим следующий код тестирования. Добавьте это в свой .bashrc:

# Set proper $TERM if we are running gnome-terminal
if [ "$COLORTERM" == "gnome-terminal" ]
then
    TERM=xterm-256color
fi

поместите это в файл python и запустите его.

import curses

def main(stdscr):
    curses.start_color()
    curses.use_default_colors()
    for i in range(0, curses.COLORS):
        curses.init_pair(i + 1, i, -1)
    try:
        for i in range(0, 255):
            stdscr.addstr(str(i), curses.color_pair(i))
    except curses.ERR:
        # End of screen reached
        pass
    stdscr.getch()

curses.wrapper(main)

запуск его даст следующий результат.

screenshot

как вы видите, пары цветов 1-16-это цветовая палитра терминала для цветов переднего плана.


в настоящее время я помещаю эти строки перед своим скриптом.

curses.use_default_colors()
for i in range(0, curses.COLORS):
    curses.init_pair(i, i, -1);

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


терминал "цветовая палитра" устанавливается самим терминальным приложением, чтобы сопоставить цвета проклятий по умолчанию для конкретных приложений "интерпретаций". Если вы используете красный, терминал может выбрать для отображения как бордовый или вишневый, или, если пользователь желает, что-то совсем другое.

другими словами, просто используйте цвета проклятий (в сочетании с модификаторами bright или blink или без них), и все должно работать.

Я считаю, что curses.use_default_colors() звоните просто делает прозрачность доступной; это прямой вызов use_default_colors() функция API ncurses. цвета ncurses в противном случае основаны на палитре; вам нужно установить свои собственные атрибуты цвета на номер пары с curses.init_pair() звонки, затем выберите цветовую пару с curses.color_pair() из палитры для отображения текста с этой конкретной парой; или создавать текстовые атрибуты непосредственно для данного addstr() звонок.


У меня нет rep-points для отправки этого в качестве комментария к Отличный ответ, вождь десять Brinke, поэтому я предложу здесь более полезную версию своего цвета скрипт:

import curses
def main(stdscr):
    curses.start_color()
    curses.use_default_colors()
    for i in range(0, curses.COLORS):
        curses.init_pair(i + 1, i, -1)
    stdscr.addstr(0, 0, '{0} colors available'.format(curses.COLORS))
    maxy, maxx = stdscr.getmaxyx()
    maxx = maxx - maxx % 5
    x = 0
    y = 1
    try:
        for i in range(0, curses.COLORS):
            stdscr.addstr(y, x, '{0:5}'.format(i), curses.color_pair(i))
            x = (x + 5) % maxx
            if x == 0:
                y += 1
    except curses.ERR:
        pass
    stdscr.getch()
curses.wrapper(main)

можно использовать culour пакета установки с:

pip install culour

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

culour.addstr(window, "colored string")