【问题标题】:Text appears mangled when bkgd char is curses.ACS_CKBOARD当 bkgd char 为 curses.ACS_CKBOARD 时,文本出现损坏
【发布时间】:2017-05-11 04:15:40
【问题描述】:

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

这似乎工作正常,但是当我调用 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。如果我在终端中运行相同的代码,我会得到类似的结果,但颜色错误:

更新:

阅读 Thomas Dickey 的回答后,我尝试实施他的建议。我尝试设置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))

这行得通!这是显示结果的屏幕截图:

感谢 Thomas,关于在绘制后重置背景的建议!

【问题讨论】:

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


    【解决方案1】:

    背景字符(您已使用scr.bkgd 设置)是视频属性、颜色对和与添加到屏幕的其他字符合并的字符的组合,例如,通过@987654326 @。

    不管怎样,X/Open Curses 在 Rendition of Characters Placed into a Window 中记录了该功能。

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

    指定的属性,与窗口属性进行或运算。

    如果你不想这样,你可以

    • 临时设置背景,擦除窗口(填充背景)并在不使用备用字符集的情况下重置背景,例如,
    scr.bkgd(curses.ACS_NORMAL, curses.color_pair(1))
    • 使用不同的方法将字符添加到屏幕。底层的curses库waddchstr直接传递视频属性(不合并)。但它似乎不是 Python 绑定的一部分(reference manual) 中没有类似的东西。addstrattr 参数可能指的是 window 属性(设置具有类似的功能(在 X/Open 诅咒中,“窗口颜色”)。

    鉴于可用的功能(以及绑定的限制),使用scr.bkgd 调用是解决问题的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      相关资源
      最近更新 更多