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

标签 python psychopy

我是 Python 新手,正在编写一个简单的心理学实验。简而言之,我向参与者展示一系列随机图像,并让他们在检测到给定图像中的脸部时按一个键。

我的问题之一是,当参与者按下按键太快时,程序会崩溃 - 也就是说,我注意到即使参与者在没有图像的情况下按下按键,程序也会记录响应。每个图像只会在屏幕上显示 10 秒。参与者通常平均需要约 0.5 秒才能使用react。

是否有一个键可以让我对实验进行编程,以便 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 中是按位“OR”的运算符,是一种不同的野兽。另外,您可能想尝试使用更 Python 的 for TrialNo,stimulus in enumerate(StimList): 来代替 for TrialNo in range(len(StimList)):,当您可以使用 PsychoPy 的计时类或屏幕刷新计数进行更精确的控制时,请避免使用 time.sleep() 等标准 Python 函数。

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

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

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

关于python - 如何在简单的 Psychopy 实验中仅记录有效的按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52655924/

相关文章:

python - 使用 google appengine 在 django-nonrel 中保存实体

python - 如何使用正确的模块分发 python 程序?

python - 改善python视频演示的声音等待时间

python - 如何让 USB Controller /游戏 handle 与 python 一起工作

python - 在 PsychoPy 中定义楼梯的正确答案

python - Psychopy 中的纯音以不必要的咔嗒声结束

python - PsychoPy 中的二进制表示和设置并行端口数据

python - 这里是否存在竞争条件以及如何处理它?

python - Azure 和 Databricks 寄予厚望

python - 解码十六进制 UTF-8 字符