やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

window/padには謎のクセがある。

 cursesのwindow/padには謎のクセがある。せっかく便利なクラスなのに、つかいづらい。謎のエラーが頻発した。エラーメッセージがないため、原因や対処がまったくわからずハマった。

 試行錯誤したところ、次のようなクセがあることがわかった。こういう暗黙のルールはPythonの資料に明文化されていなかったため、書き残す。

成果物

共通

  • subwinnewwinオブジェクトからしか呼び出せない
    • newwinからsubpadを呼び出せない
  • subpadnewpadオブジェクトからしか呼び出せない
    • newpadからsubwinを呼び出せない
  • subwin/subpadは引数4つでないとエラーになる
    • 引数2つだと以下エラーになる
    • _curses.error: curses function returned NULL
  • subwin,subpadは自動的にoverlayされる
  • refresh順に画面が描画される
  • getchはそれを呼び出したwindowオブジェクトの内容で画面を描画してしまう
    • 複数のwindowを使うときは要注意。overlayして1つのwindowに集約し、そのwindowオブジェクトでgetchを呼ぶこと

window

  • initscr/wrapperで得られるstdscrwindowである
  • 複数のnewwinを使うときstdscroverlayすることで描画できる
    • getchstdscrで呼び出すこと
    • 所定のwindowオブジェクトで呼ぶとそのwindowの内容が画面に描画されてしまう

pad

  • newpad,subpadで生成するときの第1,2引数は物理端末サイズより大きくすることでpadを有効に使える
    • pad = curses.newpad(curses.LINES*3, curses.COLS*3)
    • sub = pad.newpad(curses.LINES*3, curses.COLS*3)
  • padrefreshは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
  • stdscrgetchするとstdscrが描画されてしまいpadが描画されない
    • padgetchすることでpadが描画される
    • pad.keypad(True)することでpadがキー受付可能になる
  • newpadを複数つかってoverlayしようとしても最後にrefreshしたpadだけしか描画されない
    • newpadを1つだけつくり、そのsubpadをつくることで部品化できる
  • padnoutrefreshで一括更新できない
  • padmvwinできない。座標は(0,0)固定である

用途

クラス 用途
window 表示領域が端末の物理サイズ以内である
pad 端末の物理サイズ以上である
用途 window pad
最小コード(1つの窓)
1つの親窓に2つの子窓
2つの親窓をstdscroverlayする
1つの親窓に2つの小窓を[panel][]で持つ
2つの親窓を切り替える