2012-12-22 14 views
6

私はpythonでcursesプログラムを作成しました。それは正常に動作します。しかし、私がnodelay()を使用すると、プログラムは何も表示されずに(単に新しいプロンプトで)端末で起動した直後に終了します。nodelay()はpython cursesプログラムを終了させます

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

EDIT:

 
sc = curses.initscr() 

sc.nodelay(1) # But removing this line allows the program to run properly 

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

ここに私の完全なコード

 
import curses, time, sys, random 

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

def feed(): 
     #... 

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

# vars + colors inited 

for angry in range(20): 
     try: 
       dir = chr(sc.getch()) 

       sc.clear() 

       feed() 

       #lots of ifs 

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

       for point in body: 
         paint(*point, i=2) 

       sc.move(height-1, 1) 
       sc.refresh() 
       time.sleep(wait) 

     except Exception as e: 
       print sys.exc_info()[0], e 

sc.getch() 
curses.beep() 

curses.endwin() 

がなぜこのhappenningありだし、どのように私はnodelay()安全に使用することができますか?sc.nodelay()ラインなしかとあなたの小さなテストプログラムを実行するときに

+1

バグを再現するために必要な最小限のコードを作成してください。たとえば、nodelay()を設定してから、キーをgetch()すると壊れて終了する無限ループに入ることができます。最小のテストケースでバグが消えたら、何が変わったのか把握してください。それが失敗したテストケースを投稿するのに役立たない場合。 – Philip

+0

@Philip良い考えは、そうし、結果を掲載しました。 – ACarter

答えて

5

私が働いて基本的な機能を得るためにあなた縮小さデモを書き換えました。それはnonblocking 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を打つ)に当たった場合、終了する前にカーソルを無効にするなど、端末に対して行ったすべての変更を元に戻すことです。あなたがデバッグしているときは、多くの助けになります。

ここからは、ごくわずかな手順でプログラムの機能を追加することをおすすめします。 Cursesは苦労しています。一度にたくさんの変更を加えると、どのオブジェクトが壊れているのか把握するのが難しいです。がんばろう!

+1

解決済み。メインのラッパーを追加すると、 'getch()'が何も返されなかったとき(入力が利用できなかったため)にエラーが出て終了していて、 'chr()'に入れようとしましたが、何もない。あなたに助けてくれてありがとう、これは他のバグを解決するときに本当に便利です。 – ACarter

0

は、私は何の違いを見ていません。どちらの場合は、画面に何も印刷し

...

+0

ポイントは私のために、 'sc.nodelay()'で、cursesウィンドウは開かれていないので、何もすることができないので何もできません。 – ACarter

関連する問題