我已经阅读教程有关的诅咒的编程在蟒蛇,和许多参考一种能力以利用扩大的人物,例如画线符号。他们是人物>255,并诅咒图书馆知道如何显示他们在目前的终端字体。

一些教程说你用这样的:

c = ACS_ULCORNER

...和一些说你用这样的:

c = curses.ACS_ULCORNER

(这应该是左上角的一个盒子里,像我垂直翻转)

无论如何,无论哪种方法使用,该名称是不是定义和程序因此而失败。我试图"进口的诅咒"和"从诅咒进口*",并且既不能工作。

诅咒'窗口()function使用了这些字符,因此我甚至尝试戳我框源,看看如何 它的 不,但是我不能找到它的任何地方。

有帮助吗?

解决方案

curses/__init__.py

  

一些常数,最引人注目的是ACS_*   的,仅添加到C-   _cursesinitscr()模块的字典中被调用。 (有些版本   SGI的的诅咒没有定义值   对于那些常量,直到initscr()   被调用。)此包装   函数调用底层的C   initscr(),然后复制   从常量   _curses模块诅咒包的字典。不要做“from curses import *”如果你们需要的   ACS_*常数。

在换句话说:

>>> import curses
>>> curses.ACS_ULCORNER
exception
>>> curses.initscr()
>>> curses.ACS_ULCORNER
>>> 4194412

其他提示

我相信以下的适当相关的,被公布在这个问题。在这里,我将可以使用 utfinfo.pl (另见上 超级用户).

首先,对于标准ASCII character set,Unicode码点和字节的编码是一样的:

$ echo 'a' | perl utfinfo.pl 
Char: 'a' u: 97 [0x0061] b: 97 [0x61] n: LATIN SMALL LETTER A [Basic Latin]

因此,我们可以做蟒蛇的 curses:

window.addch('a')
window.border('a') 

...它可以作为旨在

然而,如果一个角色是基本上ASCII,则有差异, addch 文档 不一定明确。第一,我可以这样做:

window.addch(curses.ACS_PI)
window.border(curses.ACS_PI)

...在这种情况下,在我的 gnome-terminal, ,Unicode character'π'是渲染。但是,如果你检查 ACS_PI, 你会看到它是一个整数量,价值4194427(0x40007b);因此以下会也呈现同样的角色(或评价者、字形?) 'π':

window.addch(0x40007b)
window.border(0x40007b)

来看看发生了什么事情,我grepped通过 ncurses 来源,并找到如下:

#define ACS_PI      NCURSES_ACS('{') /* Pi */  
#define NCURSES_ACS(c)  (acs_map[NCURSES_CAST(unsigned char,c)])
#define NCURSES_CAST(type,value) static_cast<type>(value)
#lib_acs.c: NCURSES_EXPORT_VAR(chtype *) _nc_acs_map(void): MyBuffer = typeCalloc(chtype, ACS_LEN);
#define typeCalloc(type,elts) (type *)calloc((elts),sizeof(type))
#./widechar/lib_wacs.c: { '{',  { '*',  0x03c0 }},  /* greek pi */

注意到在这里:

$ echo '{π' | perl utfinfo.pl 
Got 2 uchars
Char: '{' u: 123 [0x007B] b: 123 [0x7B] n: LEFT CURLY BRACKET [Basic Latin]
Char: 'π' u: 960 [0x03C0] b: 207,128 [0xCF,0x80] n: GREEK SMALL LETTER PI [Greek and Coptic]

...无论其涉及的价值4194427(0x40007b)为 ACS_PI.

因此,当 addch 和/或 border 看看一个字上述ASCII(基本上是一个 unsigned int, ,作为反对 unsigned char),他们(至少是在这样的实例)使用这一数字 为Unicode码点,或作为UTF-8编码的字节的表示,但相反,他们使用它作为一个查找的索引 acs_map平的功能(这最终,但是, 回Unicode码点,即使它模拟VT-100).这就是为什么以下规格:

window.addch('π') 
window.border('π') 

将失败Python2.7 argument 1 or 3 must be a ch or an int;在Python3.2会呈现一个简单的空间,而不是一个角色。当我们指定 'π'.实际上,我们已经指定的UTF-8编码[0xCF,0x80]-但即使如果我们指定的Unicode码点:

window.addch(0x03C0) 
window.border0x03C0) 

...它只是使没有什么(空间)两个Python2.7和3.2节。

就是说功能 addstr 接受UTF-8encoded strings,并罚款:

window.addstr('π')

...但是对于边界的-因为 border() 显然,处理人物以同样的方式 addch() 不会-我们显然运气不好,为什么没有明确指定为 ACS 恒定(并且没有许多他们,或者)。

希望这可以帮助别人,
干杯!

您可以设定当地所有的,那么你的输出编码为UTF-8如下:

import curses
import locale

locale.setlocale(locale.LC_ALL, '')    # set your locale

scr = curses.initscr()
scr.clear()
scr.addstr(0, 0, u'\u3042'.encode('utf-8'))
scr.refresh()
# here implement simple code to wait for user input to quit
scr.endwin()

输出: あ

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top