是否可以在 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问题