在 python 中是否可以使用 curses 获取默认背景颜色?

Is it possible to get the default background color using curses in python?

在 python 中使用 curses,您可以轻松地使用终端的默认配色方案:

curses.use_default_colors()

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

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

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

有什么方法可以获取默认背景色吗?还是只更改前景色?

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

好的,我明白了,

如果您使用 -1 作为值调用 init_pair,它将填充终端默认值。例如,使用默认背景制作红色文本:

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

现在curses.color_pair(1)将设置为背景。如果您在程序 运行.

时更改终端的默认值,这甚至会起作用

您必须先致电 curses.use_default_colors() 才能使用它。

window.inch(0,0) 将 return 读取 window 位置 (0,0) 处的字符的值,其中包括该位置的属性。如果你使用 stdscr 作为 window 你应该得到整个屏幕的当前颜色。引用官方文档:

"Returnwindow中给定位置的字符。低8位是字符本身,高位是属性。"

colors = stdscr.inch(0,0) & curses.A_COLOR

应该提取前景和背景的当前颜色。分离前景和背景颜色是我目前正在努力弄清楚自己但还没有太多运气的事情。在 Windows 机器上,curses 实现是 PDCurses,PDCurses 的源代码似乎说这两种颜色组合在一个 4 字节整数字段的最左边的字节中,但我还没有证实这一点。

还有 window.getbkgd() 文档说将:

"Return 给定 window 的当前背景 character/attribute 对。"

这有点含糊。我正在努力确定该函数实际上是什么 returns,尽管它听起来很像 inch 函数中的值 return。

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()