2016-05-07 4 views
1

Моя функция «hello()» просто отображает стимул на экране в течение 2 секунд, в течение которого можно нажать клавишу. Если клавиша не нажата, она ждет 1 секунду, а затем снова запускает функцию снова и снова, если клавиши не нажаты. Когда нажата клавиша, она выходит из цикла while и печатает да. По какой-то причине, если я позволю функции цикла переходить, например, 4 раза, прежде чем нажимать клавишу, я тогда получаю 5 строк печати одновременно, тогда как я бы только ожидал. Может ли кто-нибудь сказать мне, почему это, кажется, хранит заявления печати, несмотря на то, что я ожидаю, что заявление о печати никогда не будет достигнуто, пока я не нажал клавишу?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 и закончит 5-й звонок hello. Ваша программа вернется к 4.th hello и поймает нажатую клавишу. 4.th вызов вашей функции hello будет печатать снова, закончить 4.th hello и вернуться к 3.th вызова hello и так себе .....

Вы должны осторожны с recursion. Не знаю, зачем нужны переменные test и running. Но эти коды будут работать.

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); if isststance (keys, types.NoneType) или ключи [0] == 'escape': quit(); 'где' NoneType' используется для этих строк, чтобы увидеть, нужно ли выходить из одной из наших программ. – brittAnderson

0

hello() вызывает себя рекурсивно. Он будет печатать вывод один раз для каждого его вызова. Для того, чтобы получить эффект, который вы хотите, вам нужно что-то вроде этого:

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() вызывается только один раз.

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). –

Смежные вопросы