我是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()
答案 0 :(得分:0)
上面的代码存在很多Python问题,我怀疑这是由于从另一种编程语言进行的负面转移所致。例如,在Python中,您应该在逻辑比较中使用or
,而不要在|
中进行逻辑比较,在Python中,for TrialNo, stimulus in enumerate(StimList):
是不同野兽按位“ OR”的运算符。另外,如果您可以使用PsychoPy的计时类或屏幕刷新进行更精确的控制,则可能希望尝试使用更多的Pythonic for TrialNo in range(len(StimList)):
代替time.sleep()
,并避免使用event.clearEvents()
这样的标准Python函数。计数。
但是在与主要问题相关的PsychoPy API专用术语中,您需要在首先制定刺激措施之前(例如,重置试用计时器时)致电class,Alcohol,Malic acid,Ash,Alcalinity of ash,Magnesium,Total
phenols,Flavanoids,Nonflavanoid phenols,Proanthocyanins,Color
intensity,Hue,OD280/OD315,Proline
1.0,14.23,1.71,2.43,15.6,127.0,2.8,3.06,0.28,2.29,5.64,1.04,3.92,1065.0
,13.2,1.78,,11.2,100.0,2.65,2.76,0.26,1.28,4.38,1.05,3.4,1050.0
1.0,13.16,2.36,,18.6,101.0,2.8,3.24,0.3,2.81,5.68,1.03,3.17,1185.0
1.0,14.37,,2.5,,,3.85,,,,7.8,,
1.0,13.86,1.35,,16.0,98.0,2.98,,0.22,1.85,7.22,1.01,3.55,1045.0
1.0,14.1,2.16,,18.0,,2.95,,0.22,2.38,5.75,1.25,3.17,1510.0
,14.12,1.48,,16.8,95.0,2.2,2.43,0.26,1.57,5.0,1.17,2.82,1280.0
1.0,13.75,1.73,,16.0,89.0,2.6,2.76,0.29,1.81,5.6,1.15,2.9,1320.0
1.0,14.75,1.73,,11.4,91.0,3.1,3.69,0.43,2.81,5.4,1.25,2.73,1150.0
1.0,14.38,1.87,2.38,12.0,102.0,3.3,,0.29,2.96,7.5,1.2,3.0,1547.0
,13.63,1.81,2.7,17.2,112.0,2.85,2.91,0.3,1.46,7.3,1.28,2.88,1310.0
。这样会清除键盘缓冲区中所有先前按下的键。
在进一步的PsychoPy特定提示中,避免重复创建对象。例如只需在脚本开始处创建一次计时器即可。然后,您只需在每次试用时将其重置一次即可。目前,复位实际上是多余的,因为在创建计时器时将其清零。计时器很简单,并且多次创建并不会真正影响性能,但是刺激会更加复杂,您绝对应该避免一遍又一遍地创建它们。例如在这里,只需创建一次图像刺激即可。然后在每个试用版中,只需更新其image属性。这本身需要花费时间,因为需要从磁盘读取文件。因此,理想情况下,您应该在注视刺激期间或当前的两次试验之间这样做。
您的代码确实显示了一些问题,而不仅仅是您在问题中提出的问题。因此,您可能会发现https://discourse.psychopy.org上的论坛比此处的单个问答格式更有用。