2009-08-14 14 views
4

私はPythonのCursesプログラミングに関するチュートリアルを読んできました。多くは、線描画シンボルなどの拡張文字を使用する機能を指しています。それらは文字> 255であり、cursesライブラリはそれらを現在のターミナルフォントで表示する方法を知っています。Pythonのcursesライブラリで拡張文字を使用するにはどうすればよいですか?

チュートリアルのいくつかは、あなたがこのようにそれを使用すると言う:

c = ACS_ULCORNER 

...といくつかは、あなたがこのようにそれを使用すると言う:

c = curses.ACS_ULCORNER 

(これは、左上のことになっていますLは、とにかく)垂直

を反転したように箱の隅には、関係なく、私が使っている方法の、名前が定義されていないとプログラムは、このように失敗します。私は "import curses"と "curses import *"を試しましたが、どちらもうまくいきませんでした。

Cursesのwindow()関数はこれらの文字を使用しているので、ソースのために私の箱の上を突き抜けて試してみることもできますそれはですが、どこでも見つけることができません。 curses/__init__.pyから

答えて

3

いくつかの定数は、最も顕著なACS_* ものは、唯一initscr()が呼び出された後、C _cursesモジュールの辞書に追加されます。 (initscr() が呼び出されたまで。SGIの呪いの一部のバージョン は、これらの定数の値 を定義しない)このラッパー 機能は呪いパッケージのに _cursesモジュールからコピー 定数を、その後基礎となるC initscr()を呼び出し、辞書。 ACS_*の定数が必要な場合は、 'from curses import *'を入力しないでください。言い換えれば

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

感謝を。使用可能なACSの定義をPythonの 'curses'からダンプするには、次のようにします:' python -c 'import pprint、inspect、curses; curses.initscr(); outstr = pprint.pformat(inspect.getmembers(curses)); curses.endwin();プリント(outstr) '| grep ACS'を実行します。乾杯! – sdaau

4

私は以下この質問の下に掲載されるように、適切に関連していると信じています。ここではutfinfo.plを使用します(Super Userも参照)。

まず第一には、標準のASCII文字セット、Unicodeコードポイントとバイトエンコーディングのための同じである:

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

だから我々は、Pythonのcursesで行うことができます。

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

..文字は、基本的なASCIIを超えている場合、しかし、

を意図したとおり。そして、それは動作しますが、その後、必ずしも明確なことはありません addch docs違いが、あります。まず、私が行うことができます、私の gnome-terminalで、Unicode文字 'π' がレンダリングされる場合には

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

を...。しかし、ACS_PIを調べると、それは4194427(0x40007b)の値を持つ整数であることがわかります。したがって、次も同じ文字レンダリングされます「π」(または評価者、グリフを?):

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

は何が起こっているかを確認するには、私はncursesソースを通じてgreppedし、次を発見した:

#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] 

... ACS_PI用4194427(0x40007b)の値に関し、どちらも。

したがって、(unsigned charとは対照的に、基本的にunsigned intaddch及び/又はborderはASCII上記文字を見たとき、彼らは(少なくともこの例では)その番号を使用しない Unicodeコードポイントとして、またはUTFとして-8エンコードされたバイト表現を使用する代わりに、acs_map -ping関数のルックアップインデックスとして使用します(最終的には、になります。これはVT-100をエミュレートしてもUnicodeコードポイントを返します)。

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

argument 1 or 3 must be a ch or an intではPython 2.7に失敗します。次の仕様が理由ですPython 3.2では、文字の代わりに単にスペースをレンダリングします。 'π'と指定したとき。それは単にPythonの2.7と3.2の両方に何も(スペース)をレンダリングしていない...

window.addch(0x03C0) 
window.border0x03C0) 

:私たちは、Unicodeコードポイントを指定しても - 私たちは、実際にはUTF-8エンコーディング[0xCF、0x80の]を指定しました。言われていること

- 機能addstrはUTF-8でエンコードされた文字列を受け入れ、正常に動作しない:

window.addstr('π') 

...しかし、国境のため - border()が明らかにaddch()と同じ方法で文字を処理しますので、 - 明らかに、ACS定数として明示的に指定されていないものについては、運が悪いと思われます(そのうちの多くもそうではありません)。

希望すると、誰かに役立ちます。
乾杯!

3

あなたは次のように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() 

出力:そのため あ

関連する問題