在python中使用curses,您可以使用以下方法轻松使用终端的默认颜色方案:
curses.use_default_colors()
但是,一旦尝试重新着色任何字符,使用颜色对就必须声明背景颜色:
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK)
我真的不想改变默认的背景,但我想改变前景。
有没有办法获得默认背景颜色?或只改变前景色?
我知道我可以使用ANSI转义码来调整前景色,但ANSI代码与curses不兼容,我宁愿使用curses而不是重写ANSI代码中的所有内容。
答案 0 :(得分:6)
好的,我明白了,
如果您使用init_pair
作为值来调用-1
,则会填写终端默认值。例如,使用默认背景制作红色文本:
curses.init_pair(1, curses.COLOR_RED, -1)
现在curses.color_pair(1)
将设置为后台。如果在程序运行时更改终端的默认设置,这甚至可以工作。
您必须先调用curses.use_default_colors()
才能使用此功能。
答案 1 :(得分:1)
window.inch(0,0)
将通过读取窗口位置 (0,0) 处的字符返回一个值,该字符包括该位置的属性。如果您使用 stdscr
作为窗口,您应该获得整个屏幕的当前颜色。引用官方文档:
“返回窗口中给定位置的字符。低8位是字符本身,高位是属性。”
colors = stdscr.inch(0,0) & curses.A_COLOR
应该为前景和背景提取当前颜色。分离前景色和背景色是我目前正在尝试弄清楚但还没有多少运气的事情。在 Windows 机器上,curses 实现是 PDCurses,PDCurses 的源代码似乎说这两种颜色组合在一个 4 字节整数字段的最左边的字节中,但我还没有确认。
还有 window.getbkgd()
文档说:
“返回给定窗口的当前背景字符/属性对。”
这有点模糊。我正在努力确定该函数实际返回的内容,尽管它听起来很像 inch
函数返回的值。
HTH
彼得
[编辑] 这一系列的curses 调用可靠地为您提供前景色和背景色数字。在 *ix 系统上,默认值是 fg=-1 和 bg=-1(-1 表示 init_color() 函数的“默认值”)但在 Windows(python 3.8+,windows-curses 2.2.0)上,默认值是 fg =7 (COLOR_WHITE) 和 bg=0 (COLOR_BLACK)。
attr = stdscr.getbkgd()
stdscr.addstr("scrbkgd={:08X}={}\n".format(attr, attr))
pair = curses.pair_number(attr)
if platform.system() == "Windows":
pair = pair >> 16
fg, bg = curses.pair_content (pair)
stdscr.addstr("color(scrbkgd) fg={:08X}={},bg={:08X}={}\n".format(fg, fg, bg, bg))
stdscr.getch()