3

ループ内に raw_input を持つプログラムを作成しようとしています。長いループの実行中に誰かがキーを押した場合、次の raw_input がそれを入力として受け取ります。どうすればそれを回避できますか?

この単純な質問に他に何を追加すればよいかわかりません。さらに必要な場合はお知らせください。

編集

いくつかのコード

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 回実行する必要があります)。

4

3 に答える 3

3

これは、Windows 7 64ビット、python 2.7で機能します。

import msvcrt

def flush_input():
  while msvcrt.kbhit():
    msvcrt.getch()
于 2011-12-21T10:20:14.990 に答える
1

タイトルにOSを入れましたが、具体的にはウィンドウ7 64ビットです。そこに答えを見ました。それらは適用されますが、神によってそれらは非常に大きいです。n00b にやさしく、より安全に入力を受け取る方法は他にありませんか?

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

msvcrt getchコンソールから文字を読み取るために使用します。msvcrt.kbhit()キーの押下がキーボード バッファなどに存在するかどうかをテストします。MattH が示したように、それはほんの数行のコードです。そして、あなたが初心者だと思うなら、この機会に何か新しいことを学びましょう。

于 2011-12-21T10:46:57.060 に答える
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 への依存度が低くなります

動作するはずの別の方法があります。私はそれをテストするのに便利なWindowsボックスを持っていませんが、それは私が使用していたトリックであり、かなり文書化されていません. おそらく私は秘密を漏らしています...しかし、基本的にはこのようなものです.魔法の計算の開始時にスクリーンセーバー機能をオンにするAPIを呼び出すことで、アプリがスクリーンセーバーであるとOSに思わせる. 魔法の計算が終了したとき、または入力を再び受け入れる準備ができたときに、API を再度呼び出して、スクリーンセーバー機能をオフにします。

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

それを行う別の方法もあります。あなたは窓にいるので、これもうまくいきます。かなりの量の作業ですが、それほど多くはありません。Windows では、フォアグラウンド (Z オーダーの一番上) にあるウィンドウは、そのウィンドウが「生の入力スレッド」を取得します。生の入力スレッドは、マウスとキーボードの入力を受け取ります。したがって、すべての入力をキャプチャするには、Z オーダーの一番上にある透明なウィンドウまたは (非透明な) ウィンドウを立ち上げる関数を作成するだけです。 Even Geduld または Please wait などのメッセージをユーザーにさらに入力を求める準備ができたら、showwindow() を使用してウィンドウを非表示にし、以前の結果を表示し、入力を取得してからウィンドウを再表示し、すべてのキー/マウスをキャプチャします。もう一度。

もちろん、これらのソリューションはすべて、何らかの試行/例外処理および/または低レベルの Windows SDK 呼び出しのラッピングを実装しない限り、特定の OS に結び付けられます。

于 2011-12-21T12:41:13.943 に答える