PsychoPy Coder: проблемы с завершением цикла при нажатии клавиши

Я пытаюсь провести эксперимент, в котором размер стимула может непрерывно (кадр за кадром) изменяться участником (например, нажатие/удержание клавиши ВВЕРХ увеличивает размер, клавиша ВНИЗ уменьшает размер) и подтверждается нажатием клавиши ВВОД- ключ. Я обнаружил, что использование Key.StateHandle() из pyglet полезно, и в основном мой код работает так, как предполагалось. Однако я обнаружил, что некоторые «испытания» пропускаются.

Вот мой код:

from psychopy import visual, core, event
from pyglet.window import key 
win = visual.Window([1280,1024], fullscr=False, units='deg',monitor='testMonitor',winType='pyglet')
keyState=key.KeyStateHandler() 
win.winHandle.push_handlers(keyState) 

myCircle = visual.Circle(win,edges=128,radius=2.5,lineColor='black',fillColor='black',units='deg') 
myCircle2 = visual.Circle(win,edges=128,radius=2.5,lineColor='black',fillColor='black',units='deg') 
response=0

for i in range(5):
    sizeIni=1.0
    myCircle2.setRadius(sizeIni)
    myCircle2.setPos([0.0, -10.0])
    event.clearEvents()
    response=0
    while response <> 1: 
        response=None
        if keyState[key.UP]:
            sizeIni=sizeIni+0.03333
            if sizeIni>=10.0:
                sizeIni=10.0
            myCircle2.setRadius(sizeIni)
            response=0
        elif keyState[key.DOWN]:
            sizeIni=sizeIni-0.03333
            if sizeIni<=1.0:
                sizeIni=1.0
            myCircle2.setRadius(sizeIni)
            response=0            
        elif keyState[key.ENTER]:
            size=sizeIni
            print size
            response=1
        elif keyState[key.ESCAPE]:
            core.quit()        
        size=sizeIni
        myCircle.draw()
        myCircle2.draw()
        win.flip()

Эта процедура должна привести к 5 испытаниям, но некоторые испытания пропущены. Вот прототипный вывод:

1.36663
1.0 # this trial is skipped 
1.6666
2.23321
1.0 # this trial is skipped 

Там порядок пропущенных испытаний также является переменным. Я столкнулся с проблемой на двух разных компьютерах (Ubuntu/Windows 7). Есть ли в моем коде явные ошибки или есть совет, как закодировать эксперимент по-другому?


person Boo    schedule 30.07.2014    source источник
comment
Я не уверен, что вы имеете в виду под пропущенными испытаниями. Похоже, вы получаете результаты всех пяти испытаний. Те, которые вы отметили как пропущенные, будут соответствовать тем, в которых была обнаружена только клавиша ввода, и, следовательно, выводится только начальное значение размера (1,0). Не могли бы вы поконкретнее описать, в чем проблема?   -  person Michael MacAskill    schedule 31.07.2014


Ответы (1)


Я думаю, проблема в том, что вы проверяете, нажата ли клавиша ввода, но не отпускается ли она перед повторным обнаружением. т. е. этот код проверяет состояние ключа один раз в каждый период обновления экрана. Возможно, что субъект нажимает ввод в ответ на одну попытку, но затем эта клавиша все еще нажата, когда изображение сбрасывается до исходного размера и начинается следующая попытка.

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

person Michael MacAskill    schedule 31.07.2014
comment
Конечно, вы были правы в том, что испытания на самом деле не пропускались. Но так как не было показа стимула, я просто назвал его пропущенным. Также вы были правы, предположив, что клавиша ENTER по-прежнему определяется как нажатая, когда изображение сбрасывается до исходного размера и начинается следующее испытание. Я добавил цикл проверки отпущенной клавиши ENTER, и теперь все работает нормально. Спасибо!!! - person Boo; 31.07.2014