mat*_*ots 6 python curses ncurses
curses我正在使用标准库中的模块用 Python 编写程序。
我希望我的程序在无法使用我用 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)
Run Code Online (Sandbox Code Playgroud)
我得到的结果是:
我预计黑色会被红色取代。
我是否误解了文档?我怎样才能curses尊重我想要使用的自定义 RGB 颜色?或者至少失败并告诉我终端不支持它?
这里的curses 文档似乎表明,如果失败,它将返回一个错误,并且CPython 源代码似乎非常忠实地传播curses 错误。
如果相关的话,我使用的是 OS X 10.11,并且正在使用 Homebrew 安装的 Python3 上进行测试。但我使用 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)
Run Code Online (Sandbox Code Playgroud)
截图可能是Terminal.app;快速检查一下,它不遵守用于更改颜色的转义序列。另一方面,iTerm2 确实使用了这些转义序列。
如果您使用的是 Terminal.app,则设置TERM为 xterm-256color 是没有意义的,因为与 xterm 存在大量差异。终端数据库中有一些讨论作为您可能会感兴趣的评论。
curses 用于决定终端是否可以改变颜色的相关功能是ccc和initc。这些功能未在nsterm终端描述中定义。终端描述使用xterm+256setaf构建块而不是xterm+256color,这infocmp显示是不同的:
比较 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'。
操作:'\E[39;49m',NULL。