我正在尝试使用“haze”字符 - ACS_CKBOARD
- 作为背景,并具有自定义前景色和背景色。
这看起来工作正常,但是当我调用 addstr
在背景顶部显示文本时,文本出现乱码。它似乎是选择的“替代字符”来代替我的“Hello,world!”,当然除了一些正常的字母之外。
这是一个小屏幕截图:
我假设诅咒内部有什么东西被卡住了。有谁知道如何才能在这种背景下显示正确的文本?
下面是一些产生该行为的代码:
import curses
import locale
def main(scr):
curses.init_color(2, 650, 407, 160) # brown
curses.init_color(6, 149, 113, 78) # tan
curses.init_pair(1, 2, 6)
scr.bkgd(curses.ACS_CKBOARD, curses.color_pair(1))
scr.clear()
scr.addstr(10, 0, 'Hello, world!', curses.color_pair(0))
scr.getch()
if __name__ == "__main__":
locale.setlocale(locale.LC_ALL, '')
curses.wrapper(main)
FWIW:我在 Mac 上使用 iTerm2,Python 版本 3.5.3。如果我在终端中运行相同的代码,我会得到类似的结果,但颜色错误:
更新:
读完托马斯·迪基的回答后,我尝试实现他的建议。我尝试设置 bkgd
,然后设置 clear
和 erase
,然后再调用一次来设置 bkgd
。那不起作用-我得到了没有背景字符的颜色。查看 bkgd
的文档,它确实指定“然后将更改应用于该窗口中的每个字符位置”,所以这是正确的!
然后我发现window.bkgdset(char[, attr])
,不会立即将其设置应用于每个字符位置。相反,它仅适用于新绘制的位。使用该功能,我修改了代码如下:
curses.init_pair(1, 2, 6)
scr.bkgd(curses.ACS_CKBOARD, curses.color_pair(1))
scr.erase()
scr.bkgdset(' ', curses.color_pair(1))
scr.addstr(10, 0, 'Hello, world!', curses.color_pair(0))
这有效!这是显示结果的屏幕截图:
谢谢托马斯,关于绘制后重置背景的建议!
最佳答案
背景字符(您使用scr.bkgd
设置的)是视频属性、颜色对和字符的组合,它与添加到视频中的其他字符合并。屏幕,例如通过 scr.addstr
。
就其值(value)而言,X/Open Curses 在 Rendition of Characters Placed into a Window 中记录了该功能。 .
备用字符集方面是这些视频属性之一,如 X/Open Curses 所记录:
the attributes specified, OR-ed with the window attributes.
如果你不想这样,也可以
- 临时设置背景,删除窗口(填充背景)并重置背景而不使用备用字符集,例如,
scr.bkgd(curses.ACS_NORMAL, curses.color_pair(1))
- 使用不同的方法向屏幕添加字符。底层的curses库waddchstr直接传递视频属性(不合并)。但它似乎不是 Python 绑定(bind)的一部分( reference manual) 中没有类似的东西。
addstr
的 attr 参数可能引用 window 属性(设置具有类似的功能(在 X/Open 诅咒中,“窗口颜色”)。
考虑到可用的函数(以及绑定(bind)的限制),使用 scr.bkgd
调用是解决问题的方法。
关于python - 当 bkgd 字符为curses.ACS_CKBOARD 时,文本显示损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43906435/