2

我尝试运行一个实验,其中刺激大小可以由参与者连续(逐帧)更改(即按下/按住向上键增加大小,向下键减小大小)并使用 ENTER- 确认钥匙。我发现使用 pyglet 中的 Key.StateHandle() 很有帮助,基本上我的代码可以按预期工作。但是,我发现一些“试验”被跳过了。

这是我的代码:

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)上收到了问题。我的代码中是否有任何明显的错误,或者是否有任何建议如何以不同的方式对实验进行编码?

4

1 回答 1

2

我认为问题在于您正在检查是否按下了回车键,而不是在再次检测到它之前是否被释放。即此代码在每个屏幕刷新期间检查一次键状态。有可能受试者为响应一次试验而按下输入,但当图像重置为其原始大小并开始下一次试验时,该键仍处于按下状态。

您应该跟踪两个连续的按键检测是否是由于 enter 键造成的,而中间没有任何按键被按下或检测到其他按键之一。我想这对于其他两个键不是必需的,因为您想连续响应这些键,而输入键应该被视为离散事件。

于 2014-07-31T03:25:41.803 回答