当 bkgd char 为 curses.ACS_CKBOARD 时,文本显示错乱

Text appears mangled when bkgd char is curses.ACS_CKBOARD

我正在尝试使用 "haze" 字符 - ACS_CKBOARD - 作为背景,具有自定义的前景色和背景色。

这似乎工作正常,但是当我调用 addstr 在背景顶部显示文本时,文本出现乱码。它似乎是 "alternate characters" 的选择,而不是我的 "Hello, world!",当然除了一些正常的字母显示出来。

这是一个小屏幕截图:

我假设 curses 中有东西卡住了。有谁知道我如何才能在这种背景下显示正确的文本?

下面是一些产生行为的代码:

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、Python 版本 3.5.3 上使用 iTerm2。如果我在终端中 运行 相同的代码,我会得到类似的结果但颜色错误:

更新:

阅读 Thomas Dickey 的回答后,我尝试实施他的建议。我尝试设置 bkgd,然后设置 clearerase,然后再设置 bkgd。那没有用-我得到了没有背景字符的颜色。查看 bkgd 的文档,它确实指定了 "The change is then applied to every character position in that window"、 所以这就对了!

然后我发现 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))

这很有效!这是显示结果的屏幕截图:

谢谢 Thomas 关于在绘画后重置背景的建议!

背景字符(你用scr.bkgd设置的)是视频属性、颜色对和字符的组合,与添加到屏幕,例如,通过 scr.addstr.

对于它的价值,X/Open Curses 记录了 Rendition of Characters Placed into a Window 中的功能。

备用字符集方面是这些视频属性之一,如 X/Open Curses 所记录:

the attributes specified, OR-ed with the window attributes.

如果你不想这样,你可以

  • 临时设置背景,擦除window(填充背景)并在没有备用字符集的情况下重置背景,例如
    scr.bkgd(curses.ACS_NORMAL, curses.color_pair(1))
  • 使用不同的方法向屏幕添加字符。底层 curses 库 waddchstr passes the video attributes directly (no merging). But it does not appear to be part of the Python binding (nothing similar in the reference manual). The attr parameter of addstr 可能指的是 window 属性 (设置有类似的功能(在 X/Open curses 中,"window colour" ).

考虑到可用函数(和绑定的限制),调用 scr.bkgd 是解决问题的方法。