Python 当bkgd char为curses.ACS\u电路板时,文本出现损坏

Python 当bkgd char为curses.ACS\u电路板时,文本出现损坏,python,python-3.x,ncurses,curses,python-curses,Python,Python 3.x,Ncurses,Curses,Python Curses,我试图使用一个“haze”字符作为背景,带有自定义的前景色和背景色 这看起来还可以,但是当我调用addstr在背景上显示文本时,文本是乱码。这似乎是一个“替代字符”的选择,以取代我的“你好,世界!”,当然,除了一些正常的字母显示通过 下面是一个小屏幕截图: 我想诅咒里面一定有东西卡住了。有人知道如何在这种背景下显示正确的文本吗 下面是一些生成行为的代码: import curses import locale def main(scr): curses.init_color(2, 6

我试图使用一个“haze”字符作为背景,带有自定义的前景色和背景色

这看起来还可以,但是当我调用
addstr
在背景上显示文本时,文本是乱码。这似乎是一个“替代字符”的选择,以取代我的“你好,世界!”,当然,除了一些正常的字母显示通过

下面是一个小屏幕截图:

我想诅咒里面一定有东西卡住了。有人知道如何在这种背景下显示正确的文本吗

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

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。如果在Terminal中运行相同的代码,则会得到颜色错误的类似结果:

更新:

在阅读了托马斯·迪基的答案后,我试图实现他的建议。我尝试设置
bkgd
,然后是
clear
erase
,然后是另一个设置
bkgd
的调用。这不起作用-我得到的颜色没有背景字符。查看
bkgd
的文档,它确实指定了“然后将更改应用到该窗口中的每个字符位置”,所以这是正确的

然后我发现,它不会立即将其设置应用于每个角色的位置。相反,它只适用于新绘制的位。使用该函数,我对代码进行了如下修改:

    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

值得一提的是,X/opencurses在中记录了该功能

备用字符集特性是这些视频属性之一,如X/Open Curses所述:

指定的属性,或与窗口属性关联

如果你不想那样,你可以

  • 临时设置背景,擦除窗口(填充背景)并重置背景,而不使用备用字符集,例如
scr.bkgd(curses.ACS_正常,curses.color_对(1))
  • 使用不同的方法向屏幕添加字符。底层curses库直接传递视频属性(无合并)。但它似乎不是Python绑定的一部分(在中没有类似的内容)。的attr参数可能指的是window属性(使用类似的函数设置)(在X/Open curses中,为“window color”)
考虑到可用的函数(以及绑定的限制),使用
scr.bkgd
调用是解决问题的方法

scr.bkgd(curses.ACS_NORMAL, curses.color_pair(1))