python - 当 bkgd 字符为curses.ACS_CKBOARD 时,文本显示损坏

标签 python python-3.x ncurses curses python-curses

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

这看起来工作正常,但是当我调用 addstr 在背景顶部显示文本时,文本出现乱码。它似乎是选择的“替代字符”来代替我的“Hello,world!”,当然除了一些正常的字母之外。

这是一个小屏幕截图:

iTerm2 Screen with background set to CKBOARD, mangled text in front

我假设诅咒内部有什么东西被卡住了。有谁知道如何才能在这种背景下显示正确的文本?

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

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

Mac Terminal screen with background set to CKBOARD, mangle text in front

更新:

读完托马斯·迪基的回答后,我尝试实现他的建议。我尝试设置 bkgd,然后设置 clearerase,然后再调用一次来设置 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))

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

iTerm2 screen with background ACS_CKBOARD, with clear text

谢谢托马斯,关于绘制后重置背景的建议!

最佳答案

背景字符(您使用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) 中没有类似的东西。 addstrattr 参数可能引用 window 属性(设置具有类似的功能(在 X/Open 诅咒中,“窗口颜色”)。

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

关于python - 当 bkgd 字符为curses.ACS_CKBOARD 时,文本显示损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43906435/

相关文章:

Python如何使用列表等待读数完成?

python - 在漫长的过程中与 Tkinter 窗口交互

Python Paho 客户端发布失败,至少有 1 个错过发布

python - 在理解过程中检查字典中的键

linux - 检测 curses 中的自动按键重复

c++ - 使用 ncurses 创建一个函数来检查 Unix 中的按键

python - 在 flask 中打印多张图像(每行)

python:在 while 循环中区分 b/w multiple-ifs 和 if-elif-else

python-3.x - pandas 数据框的列表列表列表

c - 使用 ncurses 处理转义序列? printf 是否处理转义序列?