Как использовать один и тот же ключ для многократного перелистывания в PsychoPy?

Я пытаюсь использовать одну и ту же клавишу для перелистывания после нескольких последовательных стимулов в PsychoPy, но тогда он также продолжает перелистывать последовательные экраны.

Я придумал следующую небольшую модификацию одного из примеров в руководстве:

from psychopy import visual, core, event

win = visual.Window(monitor="testMonitor", units="deg")

stim1 = visual.TextStim(win, text="Stim 1", pos=(0,0))
stim2 = visual.TextStim(win, text="Stim 2", pos=(0,0))
stim3 = visual.TextStim(win, text="Stim 3", pos=(0,0))

while len(event.getKeys(['space'])) <= 0:
    stim1.draw()
    win.flip()

event.clearEvents()
print(event.getKeys()) # test if key buffer is really empty
win.flip()

# while len(event.getKeys(['return'])) <= 0:
#     stim2.draw()
#     win.flip()

# event.clearEvents()
# win.flip()

while len(event.getKeys(['space'])) <= 0:
    stim3.draw()
    win.flip()

event.clearEvents()
win.flip()

win.close()
core.quit()

Однако, если я нажму пробел на первом экране, он не просто перевернет этот экран. Вместо этого он будет мигать stim3 в течение доли секунды, а затем немедленно прекратит работу. Если, с другой стороны, я использую другой ключ для второго стимула (замените 'space' на 'return' в условии цикла), это работает нормально.

Мое первое подозрение заключалось в том, что event.clearEvents() каким-то образом не удалось очистить буфер событий, поэтому космическое событие из первого стимула осталось сохраненным, а также перевернуло второй стимул. Однако в этом случае stim3 вообще не должно отображаться, потому что условие цикла немедленно не выполняется. Кроме того, если я распечатаю event.getKeys() в указанной выше позиции, она окажется пустой. Более того, если я использую другую клавишу между двумя запускаемыми пробелом стимулами (удалите комментарии из раздела stim2), вдруг все клавиши работают нормально.

Кто-нибудь знает, что я делаю неправильно?

(Кстати, если вам интересно: я изменил пример вручную, изменив цикл, в котором программа ожидает ввода, с цикла while True на while len(event.getKeys(['space'])) <= 0, что устраняет необходимость использования точно такого же условия для break. Я протестировал его с исходной идиомой только что чтобы быть уверенным, и поведение точно такое же, как и в моей версии.)


person Abun    schedule 14.05.2019    source источник


Ответы (1)


После еще нескольких тестов выяснилось, что удаление win.flip() после каждого event.clearEvent() устраняет проблему. Я не совсем понимаю, почему дополнительные перевороты (которые, как я думал, необходимы для очистки экрана перед рисованием нового стимула) вызывают такое поведение. Кто-нибудь может объяснить?

person Abun    schedule 15.05.2019