Как регистрировать только действительные нажатия клавиш в простом эксперименте по психопии - PullRequest
0 голосов
/ 05 октября 2018

Я новичок в Python и программирую простой психологический эксперимент.В двух словах, я представляю участникам серию рандомизированных изображений и заставляю их нажимать одну клавишу, если они обнаруживают лицо на заданном изображении.

Одна из моих проблем заключается в том, что программа падает при нажатии участникаслишком быстрая клавиша - то есть я заметил, что программа записывает ответы, даже если участник нажимает клавишу, когда изображение отсутствует.Каждое изображение будет присутствовать на экране только в течение 10 секунд.Участнику обычно требуется ~ 0,5 секунды, чтобы ответить.

Есть ли у меня ключ, чтобы запрограммировать эксперимент, чтобы психопатия регистрировала только нажатия клавиш ОДИН РАЗ, ПОСЛЕ того, как изображение появляется на экране?Я вставил свой код ниже.

Большое спасибо.

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 Ответ

0 голосов
/ 05 октября 2018

Существует множество проблем с Python в приведенном выше коде, которые, как я подозреваю, связаны с отрицательным переносом с другого языка программирования.Например, в Python вы должны использовать or в логических сравнениях, а не |, который в Python является оператором для побитового 'ИЛИ', другого зверя.Кроме того, вы можете попробовать больше Pythonic for TrialNo, stimulus in enumerate(StimList): вместо for TrialNo in range(len(StimList)): и избегать стандартных функций Python, таких как time.sleep(), когда вы могли бы иметь более точное управление с помощью классов синхронизации PsychoPy или подсчета обновления экрана.

Но в специфических для PsychoPy API терминах, имеющих отношение к вашему основному вопросу, вам нужно позвонить event.clearEvents() перед первым использованием стимула (например, при сбросе таймера пробного запуска).Это очистит буфер клавиатуры от любых ранее нажатых клавиш.

В дальнейших подсказках, касающихся PsychoPy, избегайте повторного создания объектов.например, таймер должен быть создан только один раз, в начале сценария.Тогда вы просто сбрасываете его один раз за испытание.На данный момент сброс фактически избыточен, так как таймер обнуляется при его создании.Таймеры просты, и многократное создание на самом деле не влияет на производительность, но стимулы являются более сложными, и вам определенно следует избегать их создания снова и снова.например, просто создайте свой имидж-стимул один раз.Затем в каждом испытании просто обновляйте его свойство изображения.Это само по себе требует времени, так как файл должен быть прочитан с диска.Поэтому в идеале вы должны делать это во время периода стимуляции фиксации или между испытаниями, как это происходит в настоящее время.

Ваш код действительно показывает несколько проблем, а не только ту, которую вы подняли в вопросе.следовательно, вы можете найти форум на https://discourse.psychopy.org более полезным, чем отдельный формат вопросов и ответов здесь, на SO.

...