我尝试运行一个实验,其中刺激大小可以连续地(在逐帧基础上)由参与者改变(即按/保持上键增加尺寸,下调减小尺寸)并确认使用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)。我的代码中有任何明显的错误,还是有什么建议如何以不同的方式编写实验?

有帮助吗?

解决方案

我认为问题是您正在检查输入键是否被按下,但不是在再次检测之前是否会被释放。即,此代码在关键状态的每个屏幕刷新周期中检查一次。主题可能会推动响应一个试验的输入,但是当图像被重置为其原始大小并且下一个试验开始时,该键仍处于下降状态。

应跟踪两个连续的键按检测是否导致Enter键,而没有按下的任何键的干预时间,或者其他一个被检测到的键。我猜这两个键是不是必需的,因为你想持续回应这些键,而输入键应该被视为离散事件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top