当bkgd char为curses.ACS_CKBOARD时,文本会出现损坏

时间:2017-05-11 04:15:40

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

我试图使用" haze" character - mkdir("yourtargetpath/" . $username, 0700); - 作为背景,具有自定义前景色和背景色。

这似乎工作正常,但当我呼叫<?php header("Access-Control-Allow-Origin: *"); 在背景上显示文字时,文字会出现乱码。它似乎是一个&#34;替代角色的选择&#34;取代我的&#34;你好,世界!&#34;,当然除了一些正常的字母显示出来。

这是一个小屏幕截图:

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

我假设诅咒里面有些东西堵塞了。有谁知道如何在这个背景下显示正确的文字?

这里有一些产生行为的代码:

ACS_CKBOARD

FWIW:我在Mac,Python 3.5.3版本上使用iTerm2。如果我在终端中运行相同的代码,我会得到一个错误颜色的类似结果:

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

更新

在阅读了Thomas Dickey的回答之后,我试图实现他的建议。我尝试设置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) bkgd,然后再设置clear。那不起作用 - 我得到的颜色没有背景字符。查看erase的文档,它确实指定&#34;然后将更改应用于该窗口中的每个字符位置&#34;,以便正确显示!

然后我找到了window.bkgdset(char[, attr]),其中没有立即将其设置为每个角色的位置。相反,它只适用于新绘制的位。使用该功能,我修改了我的代码如下:

bkgd

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

iTerm2 screen with background ACS_CKBOARD, with clear text

谢谢Thomas,关于在油漆后重置背景的建议!

1 个答案:

答案 0 :(得分:1)

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

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

备用字符集方面是其中一个视频属性,并且由X / Open Curses记录:

  

指定的属性,与窗口属性进行OR-ed。

如果你不想那样,你可以

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

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