1

私は ncurses にはあまり興味がありませんが、C で動作するはずです。何が問題なのかわかりません。文字を継続的に画面に出力したいだけですが、このエラーを修正する方法が見つかりません。

    File "capture.py", line 37, in <module>
     stdscr.move(y,x)
    _curses.error: wmove() returned ERR  

コード:

(irrelevant parts of the code are removed)
import curses

stdscr = curses.initscr()
curses.noecho();

palette = [' ', ' ', '.', '.', '/', 'c', '(', '@', '#', '8']

# index is something between 0 and len(palette), not important 
for x in xrange(50):
    for y in xrange(30):
        stdscr.move(y,x)
        sdtscr.addch(palette[index])
stdscr.refresh()
4

1 に答える 1

5

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 で同じことを行うことができます...)

于 2012-09-12T23:09:48.673 に答える