【问题标题】:How to only log valid key presses in simple Psychopy experiment如何在简单的 Psychopy 实验中只记录有效的按键
【发布时间】:2018-10-04 22:15:29
【问题描述】:

我是 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 psychopy


【解决方案1】:

上面的代码有一堆 Python 问题,我怀疑这是由于从另一种编程语言的负迁移造成的。例如,在 Python 中,您应该在逻辑比较中使用 or,而不是 |,在 Python 中,| 是按位“或”的运算符,一种不同的野兽。此外,当您可以使用 PsychoPy 的计时类或屏幕刷新计数进行更精确的控制时,您可能想尝试更多 Python 风格的 for TrialNo, stimulus in enumerate(StimList): 来代替 for TrialNo in range(len(StimList)):,并避免使用像 time.sleep() 这样的标准 Python 函数。

但在与您的主要问题相关的 PsychoPy API 特定术语中,您需要在第一次绘制刺激之前调用 event.clearEvents()(例如,当您重置试用计时器时)。这将清除所有先前按下的键的键盘缓冲区。

在进一步的 PsychoPy 特定提示中,避免重复创建对象。例如计时器只需要在脚本开始时创建一次。然后,您只需在每次试用时将其重置一次。目前,重置实际上是多余的,因为计时器在创建时归零。计时器很简单,多次创建并不会真正影响性能,但刺激更复杂,您绝对应该避免一遍又一遍地创建它们。例如在这里只需创建一次图像刺激。然后在每次试验中,只需更新其图像属性。这本身需要时间,因为需要从磁盘读取文件。因此,理想情况下,您应该在固定刺激期间或在目前的试验之间这样做。

您的代码确实显示了一些问题,而不仅仅是您在问题中提出的问题。因此,您可能会发现https://discourse.psychopy.org 的论坛比 SO 的单一问答格式更有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 2014-06-18
    相关资源
    最近更新 更多