2016-05-07 10 views
1

私の関数 'hello()'は、画面に2秒間だけ刺激を表示し、その間にキーを押すことができます。キーが押されていない場合、キーが押されていない場合、1秒間待ってから再度機能を実行します。キーが押されると、whileループを抜けて「はい」と表示されます。何らかの理由で、キーを押す前に関数を4回以上ループさせると、同時に5つの印刷ステムが出力されますが、1つしか期待できません。誰かが私がキーを押すまでプリントステートメントが決して届かないと思うにもかかわらず、プリントステートメントを保管しているように見える理由を教えてもらえますか?Python:キー入力が開始されるまで関数を繰り返す

def hello(): 
    test = 1 
    running = 1 
    while running == 1: 
     for frame in range(short_frames):  # 2 seconds 
      fix.draw() 
      window.flip() 

      allKeys = event.getKeys(keyList = ('g','h')) 
      for thisKey in allKeys: 
       if thisKey == 'g': 
        keyTime=core.getTime() 
        test = 2 
       elif thisKey == 'h': 
        keyTime=core.getTime() 
        test = 2 

     window.flip() 
     core.wait(1) 

     if test == 1:    #if no key is pressed 
      hello()     #run the function again 

     running = 2     #exit out of while loop 

    print "yes" 

for i in range(1): 
    hello() 
core.quit() 
window.close() 

答えて

0

あなたはhelloに機能helloと呼ばれています。それはの再帰です。 5回目までに、キーを押します。 thingが印刷され、helloの5番目の呼び出しが終了します。プログラムは4.th helloに戻り、押されたキーをキャッチします。あなたの関数helloの4.thコールは、あなたの4.th helloを終了し、helloの3.thコールに戻り、再び印刷しますので、まあまあ.....

あなたrecursionには注意する必要があります。 私は変数testrunningがなぜ必要なのか分かりません。しかし、このコードは動作します。

def hello(): 
    is_pressed = False 
    while not is_pressed: 
     for frame in range(short_frames):  # 2 seconds 
      fix.draw() 
      window.flip() 

      allKeys = event.getKeys(keyList = ('g','h')) 
      for thisKey in allKeys: 
       if thisKey == in ['g', 'h'] 
        keyTime=core.getTime() 
        is_pressed = True 

     window.flip() 
     core.wait(1) 

    print "yes" 
+0

感謝。これはキーが押されるまでwhileループを維持しますが、whileループだけでなくキーが押されなければ、関数全体を再度実行する必要があります。これが私がhello()内からhello()を呼び出す理由です。私は即座に、印刷せずに関数の先頭に戻ると思っていました。 – Steve

+0

私は再帰に対するすべての警告に同意しますが、もっと簡単にしたいことができると思いますが、キープレスがないことを次のようにテストできます: 'keys = event.waitKeys(maxWait = 1800、 keyList = keyList); isinstance(keys、types.NoneType)またはkeys [0] == 'escape':quit(); 'これらの行には、プログラムの一部を終了するかどうかを示す' NoneType'が使われます。 – brittAnderson

0

hello()は再帰的に呼び出しています。呼び出されるたびに出力を1回印刷します。あなたが望む効果を得るために、あなたはこのようなものが必要です。whileループの下部に

def hello(): 
    test = 1 
    running = 1 
    while running == 1: 
     for frame in range(short_frames):  # 2 seconds 
      fix.draw() 
      window.flip() 

      allKeys = event.getKeys(keyList = ('g','h')) 
      for thisKey in allKeys: 
       if thisKey == 'g': 
        keyTime=core.getTime() 
        test = 2 
       elif thisKey == 'h': 
        keyTime=core.getTime() 
        test = 2 

     window.flip() 
     core.wait(1) 
     running = test 

    print "yes" 

for i in range(1): 
    hello() 
core.quit() 
window.close() 

をテスト(すなわち、キーが押されていなかった)変更されていない場合、ランニングは1に設定され、ループは続行されます。テストが2(キーが押された)の場合、実行は2に設定され、ループは終了します。 hello()は一度だけ呼び出されるので、 "yes"文字列は1回だけ出力されます。

UPDATE:

def hello(): 
    test = 1 
    for frame in range(short_frames):  # 2 seconds 
     fix.draw() 
     window.flip() 

     allKeys = event.getKeys(keyList = ('g','h')) 
     for thisKey in allKeys: 
      if thisKey == 'g': 
       keyTime=core.getTime() 
       test = 2 
      elif thisKey == 'h': 
       keyTime=core.getTime() 
       test = 2 

     window.flip() 
     core.wait(1) 
     return test 

running = 1 
while running == 1: 
    running = hello() 
print "yes" 
core.quit() 
window.close() 
+0

ありがとうございます。これはキーが押されるまでwhileループを維持しますが、whileループだけでなくキーが押されなければ、関数全体を再度実行する必要があります。これが私がhello()内からhello()を呼び出す理由です。私は即座に、印刷せずに関数の先頭に戻ると思っていました。 – Steve

+0

私の答えに更新を見てください。 whileループを関数の外に移動させて、関数がすべての反復で呼び出されるようにするのは簡単です。あなたが "pythonic"であることを気にしているならば、テストと実行中の条件値にTrueとFalseを使用するほうが(1と2ではなく)より多くなります。 –

関連する問題