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

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

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 script выводит следующий экран:

enter image description here

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

Ответы

Ответ 1

Ниже я понял эксперимент на своем собственном компьютере (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 являются цветовой палитрой терминала для цветов переднего плана.

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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)

Ответ 5

Вы можете использовать пакет culour, установив с помощью:

pip install culour

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

culour.addstr(window, "colored string")