curses move のドキュメントを読んだ場合 (例: http://linux.die.net/man/3/move ):
これらのルーチンは、失敗すると ERR を返し、正常に完了すると OK (SVr4 は「ERR 以外の整数値」のみを指定します) を返します。
具体的には、ウィンドウ ポインターが null の場合、または位置がウィンドウの外にある場合、エラーを返します。
1 つ目は Python では発生しそうにないので、2 つ目はおそらくあなたの問題です。簡単なテストでは、コードの実行は 30 行以上の端末では問題なく動作しますが、一般的な 24 行または 25 行の端末では失敗することが示されています。
デバッグを容易にしたい場合は、最初にすべてをtry
/finally:
curses.endscr()
で囲みます (端末が混乱したままにならず、出力が見えなくなる可能性があります)。stdscr.move
次に、x と y をログに記録するtry
/で呼び出しをラップして、except:
失敗した場所がわかるようにします。また、テストを迅速に行うために、「30」をコマンドライン引数にします。これらすべての変更を加えたバージョンを次に示します。
#!/usr/bin/python
import sys
import curses
height = int(sys.argv[1]) if len(sys.argv) > 1 else 24
try:
stdscr = curses.initscr()
curses.noecho();
palette = [' ', ' ', '.', '.', '/', 'c', '(', '@', '#', '8']
index = 0
for x in xrange(50):
for y in xrange(height):
index = (index + 1) % len(palette)
try:
stdscr.move(y,x)
except Exception as e:
stdscr.refresh()
curses.endwin()
print
print x, y, e
sys.exit(1)
stdscr.addch(palette[index])
stdscr.refresh()
finally:
curses.endwin()
今python cursetest 30
印刷します:
0 25 wmove() returned ERR
したがって、私が推測したように、x=0、y=25 で失敗しています。
端末を 80x50 に拡張すると、機能しますが、python cursetest 60
失敗します。
0 50 wmove() returned ERR
さらに言えば、端末を 40x50 に縮小するとpython cursetest 30
、垂直方向ではなく水平方向の端で失敗します。
40 0 wmove() returned ERR
エラーが発生したときにエラーをキャッチしようとするのではなく、事前にこれを確認したい場合はgetmaxyx()
、ウィンドウで呼び出してみてください。y<30 の場合は、適切なエラー メッセージを表示して終了できます (または、別のことを行うなど)。
最後に、簡単なチェックで、これが C でも機能しないことがわかります。もちろん、例外はスローされず、必要に応じて返されるエラーを無視することもできますが、(24, 49) の位置に 300 回連続して書き込むことになります。(実際に望むなら、移動の周りで try/catch/pass を実行することで、Python で同じことを行うことができます...)