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

Posted

技术标签:

【中文标题】是否可以在 python 中使用 curses 获取默认背景颜色?【英文标题】:Is it possible to get the default background color using curses in python? 【发布时间】:2017-10-16 07:37:34 【问题描述】:

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

curses.use_default_colors()

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

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

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

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

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

【问题讨论】:

这回答了你的问题:Read the current text color in a xterm 两个建议的答案都不正确。 【参考方案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()

【讨论】:

【参考方案2】:

好的,我想通了,

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

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

现在curses.color_pair(1) 将设置为背景。如果您在程序运行时更改终端的默认值,这甚至会起作用。

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

【讨论】:

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

以上是关于是否可以在 python 中使用 curses 获取默认背景颜色?的主要内容,如果未能解决你的问题,请参考以下文章

Windows下使用Python的Curses库时 No module named _curses问题

Python Curses 处理窗口(终端)调整大小

Setupterm 找不到终端,在 Python 程序中使用 curses

Python Curses

Python Curses

Python curses 不支持重定向