PythonでCUIをやってみる(windows編) その3

Consoleモジュール使うよりctypes経由でpdcurses叩いた方がいいんじゃないかと思えてきたが、ctypesに慣れてないので後に回すことにする。


閑話休題。前回(id:dplusplus:20080331)の続き。
とりあえずマニュアルの適当意訳やら補足やら。
正確なところは原文をお読みください。

座標系

コンソール画面の座標は2次元座標系で表される。
各文字*1セルはそれぞれ(列、行)のように表される。原点(0, 0)はスクリーンの左上隅となる。


座標の値に負の値をとることもできる。Pythonのシーケンスに対する添字のように、-1列は最も右の列を示す。

  • とマニュアルに書いているがガセ、というか表示される座標がおかしい。自分で余剰を取った方がよさそう。


rectangle()やsave()などの関数は矩形を表現するために4つ組整数のタプルを引数に取る。
(x1, y1, x2, y2)のように指定した場合、x⊂[x1, x2)、y⊂[y1, y2)の範囲が対象となる。
それぞれの値についてx1≦x2、y1≦y2でなければならず、そうでない場合の動作は保証されない。

文字色/背景色

いくつかの関数は引数により文字色/背景色を指定できる。
以下の16色がサポートされている。

0 = black (#000000) 8 = dark gray (#545454)
1 = blue (#0000a8) 9 = n/a (#5454fc)
2 = dark green (#00a800) 10 = green (#54fc54)
3 = n/a (#00a8a8) 11 = cyan (#54fcfc)
4 = red (#a80000) 12 = n/a (#fc5454)
5 = magenta (#a800a8) 13 = n/a (#fc54fc)
6 = brown (#a8a800) 14 = yellow (#fcfc54)
7 = light gray (#a8a8a8) 15 = white (#fcfcfc)

(textcolor + bgcolor * 16) の式で文字色と背景色を同時に指定する。
以降、背景色と文字色を同時に指定したものをスタイルと表記する。

カーソル

コンソール制御関数は現在のカーソル位置に依存も影響もしない。(例外はwrite、page、posのみ)
cursorメソッドにより、カーソル表示のON/OFFができる。

初期化

import Console
c = Console.getconsole()

まずは最初にこの関数を呼び、その返り値を介していろいろ操作することになる。

text(column, line, string, style)

(line行,column列)の位置から文字列stringをstyleで指定したスタイルで出力する。
styleを省略した場合のデフォルトのスタイルは黒地に白文字。


stringにunicode文字列を渡せば日本語出力もできる。(c.text(0, 0, u'ほげほげ')のように)
スクリプト自体の文字コードShift_JISの場合は c.text(0, 0, 'ほげほげ') のように書いてもそのまま通るが、unicode文字列を使ったほうが行儀がよいように思われる。


行の終わりまで来ると自動的に折り返して表示する。
行の境目にいわゆる全角文字がまたがると、その文字は単に表示されないようだ。

c.text(1, 0, u'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん', 14)


rectangle(rect, style, character)

整数四つ組のタプルで指定した矩形領域を、指定した色の文字で埋める。
style、characterはデフォルトで黒字、半角空白。
characterにunicode文字列や文字列長が2以上の文字列を渡すとTypeErrorが投げられる。

scroll(rect, dx, dy, style, character)

rectで指定した矩形領域内で、その中にある文字を(dx, dy)だけずらして再描画する。
ずらした際にできる空白を埋めるのにstyle, characterが用いられる。それぞれ省略すると黒字、半角空白となる。

page()

画面を全消去し、カーソルを(0, 0)の位置に動かす。

page(style, character)

画面を指定した色の文字で埋め、カーソルを(0, 0)の位置に動かす。
指定したスタイルは、以後デフォルトのスタイルとして扱われる。

write(string)

指定した文字列を、現在のカーソル位置からデフォルトのスタイルを用いて出力する。
(文字列中にタブ、バックスペース、改行、ベル文字も使える)
カーソルは最後に出力した文字の後ろに移動する。

pos(column, line)

カーソルを(column, line)の位置に移動させる。
座標を省略した場合、現在のカーソル位置を示すタプルを返す。

getchar()

一文字入力を行う。
F1やHome等のボタンを押した際にはそれぞれ'F1'、'Home'といった文字列が返ってくる。
左右Ctrlキー等の区別はできないようだ。

cursor()

cursor(0)でカーソル表示をOFFにする。cursor(1)でONにする。

size()

コンソールウィンドウの幅/高さを示すタプルを返す。

title(string)

コンソールのウィンドウタイトルを変更する。



一応ここまで。
Event周りはまだよく調べてないのでまた後で。


*1:特記しない限り、いわゆる半角文字を示す