我尝试进行一项实验,参与者可以连续地(逐帧)更改刺激大小(即,按下/按住UP键增加大小,DOWN键减小大小)并使用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键,但是当图像重设为其原始大小并开始下一个试验时,该键仍处于按下状态。
您应该跟踪两次连续的按键检测是否是由于Enter键引起的,而没有中间的时间间隔,即没有按键被按下,或者没有检测到另一个按键。我想这对于其他两个键不是必需的,因为您想连续响应,而回车键应该被视为离散事件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句