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 ERR
pad.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つの親窓を切り替える |