使用Python curses自定义RGB颜色

5

我正在使用Python编写一个程序,使用标准库中的curses模块。

如果无法使用我指定的RGB三元组自定义颜色,我希望我的程序能够直接退出。

因此,我有一些起始代码,如下所示:

import curses

def main(stdscr):
  if not curses.can_change_color():
    raise Exception('Cannot change color')

  curses.init_color(curses.COLOR_BLACK, 999,   0,   0)
  curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE)
  curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLACK)
  stdscr.addstr('hello', curses.color_pair(1))
  stdscr.addstr(' world', curses.color_pair(2))
  stdscr.getch()

curses.wrapper(main)

我得到的结果是:

enter image description here

我期望黑色被替换为红色。

我是否误解了文档?我如何让curses支持我想使用的自定义RGB颜色?或者至少告诉我终端不支持它?

curses的文档似乎表明,如果失败,它会返回一个错误,并且CPython源代码似乎非常忠实地传播curses错误

如果有关系的话,我正在OS X 10.11上测试Python3,我是用Homebrew安装的。但是我在OS X的内置Python解释器上也得到了同样的效果。

编辑:

稍微修改了示例代码以显示颜色内容:

import curses

def main(stdscr):
  if not curses.can_change_color():
    raise Exception('Cannot change color')

  stdscr.addstr(1, 0, repr(curses.color_content(curses.COLOR_BLACK)))
  curses.init_color(curses.COLOR_BLACK, 999,   0,   0)
  curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE)
  curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLACK)
  stdscr.addstr(0, 0, 'hello', curses.color_pair(1))
  stdscr.addstr(' world', curses.color_pair(2))
  stdscr.addstr(2, 0, repr(curses.color_content(curses.COLOR_BLACK)))
  stdscr.getch()

curses.wrapper(main)

这次的结果是: 在此输入图片描述

你能用curses.color_content检查前后吗? - Jongware
1
@RadLexus 颜色内容似乎已经更新,之前设置为 (0, 0, 0),再次检查时设置为 (999, 0, 0)。 - math4tots
@ivan_pozdeev:curses现在只是ncurses的一个包装器,后者更加强大。 - Ignacio Vazquez-Abrams
@ivan_pozdeev:那个答案建议更改默认的TERM,但我的已经设置为TERM=xterm-256color,但它不起作用。 - Jongware
1
@ivan_pozdeev 我正在使用在Mac上安装Python时默认安装的那个。其源代码位于CPython存储库中。但不确定每个标准库模块是否默认在Linux发行版中出现。 - math4tots
显示剩余3条评论
1个回答

1
这个截图可能是Terminal.app的,但在快速检查中,它不支持用于更改颜色的转义序列。另一方面,iTerm2确实使用这些转义序列。
如果您正在使用Terminal.app,则将TERM设置为xterm-256color是无意义的,因为与xterm相比存在大量差异。终端数据库中有一个discussion,作为评论,您可能会发现有趣。
相关特性用于判断终端是否支持更改颜色,这些特性是cccinitc。这些能力在nsterm终端描述中未定义。终端描述使用xterm+256setaf构建块而不是xterm+256colorinfocmp显示它们是不同的:
比较xterm+256setaf和xterm+256color。
    比较布尔值。
        ccc: F:T。
    比较数字。
    比较字符串。
        initc: NULL, '\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\'。
        oc: NULL, '\E]104\007'。
        op: '\E[39;49m', NULL。

1
我现在在外面,回去后会测试一下,但如果我记得文档正确的话,我认为包装器调用start_color(如果当前环境支持它)。 - math4tots

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接