cursesのwindow/padには謎のクセがある。せっかく便利なクラスなのに、つかいづらい。謎のエラーが頻発した。エラーメッセージがないため、原因や対処がまったくわからずハマった。
試行錯誤したところ、次のようなクセがあることがわかった。こういう暗黙のルールはPythonの資料に明文化されていなかったため、書き残す。
成果物
共通
- subwinはnewwinオブジェクトからしか呼び出せない
newwinからsubpadを呼び出せない
- subpadはnewpadオブジェクトからしか呼び出せない
newpadからsubwinを呼び出せない
- subwin/subpadは引数4つでないとエラーになる
- 引数2つだと以下エラーになる
_curses.error: curses function returned NULL
- subwin,subpadは自動的にoverlayされる
- refresh順に画面が描画される
- getchはそれを呼び出した
windowオブジェクトの内容で画面を描画してしまう
window
- initscr/wrapperで得られる
stdscrはwindowである - 複数のnewwinを使うとき
stdscrにoverlayすることで描画できる- getchは
stdscrで呼び出すこと - 所定の
windowオブジェクトで呼ぶとそのwindowの内容が画面に描画されてしまう
- getchは
pad
- newpad,subpadで生成するときの第1,2引数は物理端末サイズより大きくすることで
padを有効に使えるpad = curses.newpad(curses.LINES*3, curses.COLS*3)sub = pad.newpad(curses.LINES*3, curses.COLS*3)
padのrefreshは6つの引数が必要であるpad.refresh(0,0,0,0,curses.LINES*3, curses.COLS*3)- 第5,6引数は
物理端末サイズ-1にせねばエラーになる:_curses.error: prefresh() returned ERRpad.refresh(0,0,0,0,curses.LINES-1, curses.COLS-1)
- 開始行をインクリメントすることでスクロールする
pad.refresh(y,0,0,0,curses.LINES-1, curses.COLS-1)if curses.KEY_DOWN == key: y += 1 if y < pad.getmaxyx()[0] - curses.LINES else 0
stdscrでgetchするとstdscrが描画されてしまいpadが描画されないpadでgetchすることでpadが描画されるpad.keypad(True)することでpadがキー受付可能になる
- newpadを複数つかってoverlayしようとしても最後にrefreshしたpadだけしか描画されない
padはnoutrefreshで一括更新できないpadはmvwinできない。座標は(0,0)固定である- memo.md
subpadは未調査。
用途
| クラス | 用途 |
|---|---|
window |
表示領域が端末の物理サイズ以内である |
pad |
端末の物理サイズ以上である |
| 用途 | window |
pad |
|---|---|---|
| 最小コード(1つの窓) | ||
| 1つの親窓に2つの子窓 | ||
2つの親窓をstdscrにoverlayする |
||
| 1つの親窓に2つの小窓を[panel][]で持つ | ||
| 2つの親窓を切り替える |