7

私はPythonでcursesプログラムを作成しました。正常に動作します。ただし、を使用するnodelay()と、プログラムはターミナルで起動するとすぐに終了し、何も表示されません(新しいプロンプトのみ)。

編集

このコードはバグを再現します:

sc = curses.initscr()

sc.nodelay(1)#ただし、この行を削除すると、プログラムを正しく実行できます。

range(20)で怒っている場合:
        sc.addstr(angry、1、 "hi")

これが私の完全なコードです

呪い、時間、sys、ランダムをインポートします

def paint(x、y、i):
        #..。
def string(s、y):
        #..。

def feed():
        #..。

sc = curses.initscr()
curses.start_color()
curses.curs_set(0)
sc.nodelay(1)#########################################

 #変数+初期化された色

range(20)で怒っている場合:
        試す:
                dir = chr(sc.getch())

                sc.clear()

                餌()

                #たくさんのif

                body.append([x、y])
                body.pop(0)

                体のポイントの場合:
                        paint(* point、i = 2)

                sc.move(height-1、1)
                sc.refresh()
                time.sleep(待機)

        eとしての例外を除く:
                印刷sys.exc_info()[0]、e

sc.getch()
curses.beep()

curses.endwin()

なぜこれが起こっているのですか、そしてどうすればnodelay()安全に使用できますか?

4

2 に答える 2

8

基本的な機能を動作させるために、縮小したデモを書き直しました。ノンブロッキングのgetch()があります。getch()が呼び出されたときにQキーを押していると、プログラムは終了します。それ以外の場合、ループは続行されます。

import curses, time

def main(sc):
    sc.nodelay(1)

    for angry in range(20):
        sc.addstr(angry, 1, "hi")
        sc.refresh()

        if sc.getch() == ord('q'):
            break

        time.sleep(1)

if __name__=='__main__':
    curses.wrapper(main)

私が行った最も重要な変更は、curses.initscr()を使用する代わりに、 curses.wrapperを使用して画面コンテキストを取得することです。利点は、プログラムがキャッチされない例外に遭遇した場合(たとえば、^ Cをヒットした場合)、終了する前にカーソルを無効にするなど、端末に対して行ったすべての変更を元に戻すことです。デバッグするときに非常に役立ちます。

ここから、プログラムの機能を非常に小さなステップで追加し直すことをお勧めします。呪いは一種の苦痛であり、一度に多くの変更を加えると、どれが物事を壊したのかを理解するのは困難です。幸運を!

于 2012-12-22T22:13:16.743 に答える
0

行の有無にかかわら、小さなテストプログラム実行しても違いはわかりません。sc.nodelay()

どちらの場合も画面に何も印刷されません...

于 2012-12-22T21:06:58.960 に答える