2011-12-21 12 views
3

私はループ内にraw_inputを持つプログラムを作ろうとしています、長いループが実行されている間に誰かがキーを押すと、raw_inputは入力私はそれを避けるのですか?ウィンドウのループ中にキーを押すためにraw_inputを避ける

この簡単な質問に他に何を追加するかわかりません。もっと必要な場合は教えてください。

EDIT

for i in range(1000): 
    var = raw_input("Enter the number") 
    #.... do some long magic and stuff here which takes afew seconds 
    print 'Output is'+str(output) 

だから、誰かが魔法相内部に何かを押すと、一部のコードは、それが次のループの入力として取ることです。それが問題の始まりです。 (そして、ループは1000回実行する必要があります)。

+0

あなたが使っているコードを見せたら、助けがさらに簡単になります –

+0

私はコードを正確に表示することはできませんが、それと同等のものをお見せしましょう。 –

+1

可能な複製http://stackoverflow.com/questions/2520893/how-to-flush-the-input-stream-in-pythonお使いのOSをお知らせください。解決策はOS固有のものです。 – Abhijit

答えて

3

これはWindows 7 64bit、python 2.7で動作します。

import msvcrt 

def flush_input(): 
    while msvcrt.kbhit(): 
    msvcrt.getch() 
1

私は具体的には、タイトルに窓7 64ビットのOSを置きます。そこには の回答があります。彼らは適用されますが、神によって彼らはとても大きいです。 他のn00bは入力を取るための、より安全で安全な方法はありませんか?

なぜこのような精巧なプロセスを行う必要があるのか​​説明しようとします。キーを押すと、キーボードバッファと呼ばれるコンピュータメモリのセクションに格納されます(stdinバッファと混同しないでください)。このバッファは、プログラムによって処理されるまで、押されたキーを格納します。 Pythonは、このタスクを実行するためのプラットフォームに依存しないラッパーを提供していません。このバッファにアクセスするには、OS固有のシステムコールを使用し、それをフラッシュしたり、読み込んだり照会したりする必要があります。 msvcrtはMS VC++ランタイムライブラリであり、Python msvcrtはその上にラッパーを提供します。あなたがプラットフォームに依存しないソリューションを望んでいない限り、それはかなり単純です。

msvcrtgetchを使用してコンソールから文字を読み込みます。 msvcrt.kbhit()を使用して、キーパッドがキーボードバッファに存在するかどうかなどをテストします。 MattHが示しているように、それはちょうど2行のコードです。そして、あなたがnoobだと思うなら、この機会に新しいものを学ぶ。

1

(ループに入る前に)入力をループの外側に集めるだけです。あなたは本当にユーザーに1000の数字を入力させたいですか?あなたはおそらくあなたがします。一番上にループを入れ、最初に1000の数字を集めて配列に格納するだけです。

次に、下半分でループを変更して、すべての作業を行います。誰かが何もキーボードを入力しなければ、それは本当に重要ではありません。このような

何か:

def getvars(top=1000): 
     vars = [] 
     for i in range(0,top): 
      anum = int(raw_input('%d) Please enter another number: ' % i)) 
      vars.append(anum) 
     return vars 

    def doMagic(numbers): 
     top = len(numbers) 
     for number in numbers: 
      # do magic number stuff 
      print 'this was my raw number %s' % number 

    if __name__ == "__main__": 
     numbers = getvars(top=10) 
     doMagic(numbers) 

が働くべきであるそれを行うための別の方法がある道の別の種類と少ないOSに依存

を発表しました。私はそれをテストするのに便利なウィンドウボックスを持っていませんが、それは私が使用していたそのテクニックとそのむしろ文書化されていません。おそらく私は秘密を譲っているのですが、基本的にはこうです:あなたのアプリがあなたの魔法計算の開始時にスクリーンセーバー機能をオンにするapiを呼び出すことによってあなたのアプリがスクリーンセーバーであると考えさせるようにします。あなたの魔法の計算の終わりに、またはあなたが再び入力を受け入れる準備ができたら、apiをもう一度呼び出して、スクリーンセーバー機能をオフにしてください。

それはうまくいくでしょう。

これを行う別の方法もあります。あなたが窓にいるので、これもうまくいくでしょう。それはかなりの仕事量ですが、あまりにも多くはありません。ウィンドウでは、(Zオーダーの最上部にある)フォアグラウンドのウィンドウがそのウィンドウに「生の入力スレッド」を取得します。生の入力スレッドは、マウスとキーボードの入力を受け取ります。したがって、すべての入力をキャプチャするには、Zオーダーの最上部にある透明または非透明のウィンドウを立ち上げる関数を作成するだけです。setWindowPosはトリックを行い、画面全体をカバーし、おそらくあなたが入力を促す準備ができたら、showwindow()を使用してウィンドウを隠し、以前の結果を表示し、入力を取得してからウィンドウを再表示し、キー/マウスをキャプチャします何度も何度も。

もちろん、これらのすべてのソリューションは、何らかのtry/exceptハンドリングや低レベルのWindows SDK呼び出しのラッピングを実装していない限り、特定のOSに接続します。

関連する問題