使用Python中的curses模块,是否可以获取默认的背景颜色?

13

在Python中使用curses,您可以轻松地使用终端的默认颜色方案,方法如下:

curses.use_default_colors()

然而,一旦你尝试重新为任何字符着色,使用颜色对,你必须声明一个背景颜色:

curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK)

我真的不想改变默认的背景,但我想改变前景。

有没有办法获取默认的背景颜色?或者只更改前景颜色?

我知道可以使用ANSI转义代码来调整前景颜色,但是ANSI代码与curses不兼容,我宁愿使用curses而不是重写所有内容的ANSI代码。


这是你的答案:在xterm中读取当前文本颜色 - Thomas Dickey
两个建议的答案都是不正确的。 - Thomas Dickey
2个回答

24

好的,我已经弄清楚了。

如果你使用init_pair函数并传递-1作为参数值,它将会使用终端默认值。例如,若要制作具有默认背景的红色文本:

curses.init_pair(1, curses.COLOR_RED, -1)

现在 curses.color_pair(1) 将被设置为背景。即使在程序运行时更改终端的默认设置,这也能正常工作。

你必须先调用 curses.use_default_colors() 才能使用此功能。


1
你可以使用-1将前景/背景设置为默认颜色,但是是否可能获取用于背景的实际颜色?基本上我想知道:默认背景是黑色还是蓝色还是白色还是红色或其他什么颜色? - dthor
1
@dthor 我怀疑这是不可能的。终端背景不一定需要是统一的颜色。 - Wheat Wizard

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函数返回的值。
希望对你有所帮助。
彼得
[编辑]这个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()

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