如何使用终端调色板与curses

Chi*_*nke 23 python curses colors

我无法让终端调色板与curses一起使用.

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)
Run Code Online (Sandbox Code Playgroud)

这个python脚本产生以下屏幕:

在此输入图像描述

但是,我的gnome-terminal调色板中有更多颜色.如何在curses中访问它们?

Chi*_*nke 40

以下我通过我自己的电脑(Ubuntu 14.04,python 3)进行了实验.

  • 有256种颜色(由前8位定义).
  • 其他位用于其他属性,例如突出显示.
  • 将数字-1传递为颜色会回退到默认背景和前景色.
  • 颜色对0(模256)固定在(-1,-1)上.
  • 颜色0到15是终端调色板颜色.

请考虑以下测试代码.将此添加到您的.bashrc:

# Set proper $TERM if we are running gnome-terminal
if [ "$COLORTERM" == "gnome-terminal" ]
then
    TERM=xterm-256color
fi
Run Code Online (Sandbox Code Playgroud)

把它放在一个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)
Run Code Online (Sandbox Code Playgroud)

运行它将产生以下输出.

截图

如您所见,颜色对1-16是前景色的终端调色板.

  • 你确定这是那个截图的代码吗?在我的系统 (Ubuntu 12.04) 中,`curses.COLORS` 是 8,而不是 256,任何尝试使用上面的颜色初始化一对都会抛出异常 `_curses.error: init_pair() returned ERR`。你在使用什么 `curses` 模块,Python 标准库中的默认模块? (2认同)
  • 是的,我确定这是正确的屏幕截图。在我的 ubuntu 14.04(使用 python3)上再次运行它会产生相同的输出。而 `curses.COLORS` 对我来说是 256。 (2认同)
  • @ThomasDickey 如果您认为此堆栈上的信息可以改进,请提供您自己的答案。此外,这些信息不可能不正确,因为它是对实验的描述以及发布此答案时我的机器的观察结果。 (2认同)

Mar*_*ers 13

终端'调色板'由终端应用程序本身设置,以将默认的curses颜色映射到特定于应用程序的"解释".如果您使用红色,终端可以选择将其显示为酒红色或樱桃红色,或者如果用户如此需要,则可以选择完全不同的东西.

换句话说,只需使用curses颜色(结合或不结合明亮或闪烁修饰符),就应该使用Just Work.

我认为这一curses.use_default_colors()呼吁只是提供透明度; 它是对use_default_colors()ncurses API函数的直接调用.ncurses颜色是基于调色板的; 你需要通过curses.init_pair()调用为每对编号设置自己的颜色属性,然后curses.color_pair()从调色板中选择一个颜色对,以显示具有该特定对的文本; 或直接为给定的addstr()调用构建文本属性.


Chi*_*nke 9

我目前把这些行放在我的脚本前面.

curses.use_default_colors()
for i in range(0, curses.COLORS):
    curses.init_pair(i, i, -1);
Run Code Online (Sandbox Code Playgroud)

我不知道它是否是最好的解决方案,但至少它会产生一些与终端调色板一致的颜色对.


use*_*316 6

我没有代表点将其作为对 Chiel 10 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)
Run Code Online (Sandbox Code Playgroud)