问题描述
我是Python的新手,正在编写一个简单的心理学实验。 简而言之,我向参与者展示一系列随机图像,如果他们在给定图像中检测到面部,则让他们按下一个键。
我的问题之一是,当参与者按下按键的速度太快时,程序会崩溃-也就是说,我注意到即使参与者在没有图像的情况下按下按键,程序也会记录响应。 每个图像只会在屏幕上显示10秒钟。 参与者通常平均需要约0.5秒才能做出回应。
我有用于编程实验的键,以便Psychopy仅在屏幕上显示图像后才记录按键一次吗? 我在下面粘贴了我的代码。
非常感谢。
StimList=['Face1.png','Face2.png',]
StimList.extend(['Noise1.png','Noise2.png'])
# randomize lists:
numpy.random.shuffle(StimList)
outstr=""
for TrialNo in range(len(StimList)):
# load our image:
img=visual.ImageStim(
win=win,
image=StimList[TrialNo],
)
# draw the fixation cross and wait for trial start:
win.flip()
time.sleep(1) # wait 1 second on fixation cross
# start a trial: loop until a key has been pressed (or trial times out)
FaceDetected=0 # same as false
Responded=0 #revise
timer=core.Clock()
timer.reset()
while (not Responded) and (timer.getTime()<TimeOut): #remove not responded
img.draw()# outside loop
win.flip() #outside loop
keys=event.getKeys(keyList=['y','Y', 'n','N'], modifiers=False, timeStamped=timer)
if keys:
if (keys[0][0]=='y') | (keys[0][0]=='Y'):
FaceDetected=True
Responded=True
RT=keys[0][1]
elif (keys[0][0]=='n') | (keys[0][0]=='N'):
FaceDetected=False
Responded=True
RT=keys[0][1]
outstr=outstr+str(TrialNo)+", "+ StimList[TrialNo] +", "+str(FaceDetected)+", "+str(RT)+"\n"
print(outstr)
# first open the file:
outfile=open('tmpdata.csv', 'w')
outfile.write(outstr)
outfile.close()
win.close()
1楼
上面的代码有很多Python问题,我怀疑这是由于从另一种编程语言进行的负面转移所致。
例如,在Python中,您应该使用or
进行逻辑比较,而不是|
,在Python中是另一种野兽按位“或”的运算符。
另外,您可能想尝试更多的Pythonic for TrialNo, stimulus in enumerate(StimList):
代替for TrialNo in range(len(StimList)):
,并for TrialNo in range(len(StimList)):
避免使用标准Python函数,例如time.sleep()
使用PsychoPy的计时类或屏幕刷新计数可以进行更精确的控制。
但是,在与主要问题相关的PsychoPy API专用术语中,您需要在首次绘制刺激之前(例如,重置试用计时器时)调用event.clearEvents()
)。
这将清除键盘缓冲区中所有先前按下的键。
在进一步的PsychoPy特定提示中,避免重复创建对象。 例如,计时器只需在脚本开始处创建一次。 然后,您只需在每次试用时将其重置一次即可。 目前,复位实际上是多余的,因为在创建计时器时将其清零。 计时器很简单,并且多次创建并不会真正影响性能,但是刺激会更加复杂,您绝对应该避免一遍又一遍地创建它们。 例如,这里只需创建一次图像刺激即可。 然后在每个试用版中,只需更新其image属性。 这本身需要花费时间,因为需要从磁盘读取文件。 因此,理想情况下,您将在注视刺激期间或当前的两次试验之间这样做。
您的代码确实显示了一些问题,而不仅仅是您在问题中提出的问题。 因此,您可能会发现的论坛比此处的单个问答格式更为有用。