当前位置: 代码迷 >> python >> 如何在简单的Psychopy实验中仅记录有效的按键
  详细解决方案

如何在简单的Psychopy实验中仅记录有效的按键

热度:116   发布时间:2023-07-16 10:09:36.0

我是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()

上面的代码有很多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属性。 这本身需要花费时间,因为需要从磁盘读取文件。 因此,理想情况下,您将在注视刺激期间或当前的两次试验之间这样做。

您的代码确实显示了一些问题,而不仅仅是您在问题中提出的问题。 因此,您可能会发现的论坛比此处的单个问答格式更为有用。

  相关解决方案