Core.wait в while-l oop кажется cra sh Psychopy без сообщений об ошибках - PullRequest
0 голосов
/ 02 августа 2020

Заявление об ограничении ответственности: я не писал здесь раньше. Я пытался следовать руководству по вопросам, но, пожалуйста, сообщите мне, если чего-то очевидного не хватает.

В любом случае, я пытаюсь создать эксперимент, в котором участнику показывают стимул, он видит некоторые инструкции, затем нажмите и удерживайте ПРОБЕЛ, чтобы записать словесный ответ. Цель состоит в том, чтобы остановить запись, когда участник поднимет клавишу ПРОБЕЛ. Для этого я установил for-l oop для отображения стимулов (см. Ниже), с внутри него while-l oop, который использует пиглет для проверки каждые 0,1 секунды нажатия пробела. Если она в какой-то момент не нажата, mi c прекращает запись, а while-l oop выходит из строя.

В большинстве случаев программа работает полностью так, как задумано, и эксперимент запускается полностью. путь до конца, но повторные испытания показали, что while-l oop иногда может взломать sh Psychopy. В частности, проблема, похоже, связана с функцией core.wait ().

Две вещи делают эту проблему очень загадочной. Во-первых, это выглядит очень непоследовательно. Код работает большую часть времени , и часто весь скрипт выполняется без проблем. Во-вторых, cra sh не выдает сообщений об ошибках .

Представляет:

Проблема в while-l oop near внизу скрипта.

# Set up microphone to record.
microphone.switchOn(sampleRate=44100)
mic = microphone.AudioCapture() 

# Use pyglet to detect key-presses during recording:
key = pyglet.window.key
keyboard = key.KeyStateHandler()
win.winHandle.push_handlers(keyboard)

#Create stims and variables
instructions = visual.TextStim(win, "instructions")
stimulus = visual.ImageStim(win, image='stimuli/stimulus1.png')
xLoops = 0
max_rec_dur = 10

for i in range(50):
    xLoops = xLoops + 1
    print("Engaging for-loop for the", xLoops, "th time")
    stimulus.draw() # The stimulus the participant is to be shown.
    win.flip()
    core.wait(1) # Stimulus is displayed for 1 second.
    instructions.draw() 
    win.flip() # The participant is given some instructions.
    key2 = event.waitKeys(keyList = ["space", "escape"])[0]
    if key2 == "escape":
        core.quit()
    filename = 'recordings/recording_{}.wav'.format(i) 
    mic.reset() 
    mic.record(max_rec_dur, block=False, filename = filename)
    #
    #
    # vvv THIS IS THE PROBLEMATIC PART  vvv
    #
    print("Engaging problematic while-loop for the", xLoops, "th time")
    micrunning = True
    while micrunning == True:
        print("Engaging core.wait")
        core.wait(0.1)
        print("Checking keypress status")
        if keyboard[key.SPACE] == False:
            print("Space has been pressed, stopping mic for the", xLoops, "th time")
            mic.stop()
            micrunning = False

Как видите, я включил сообщения печати вокруг проблемной c части кода. Каждый раз при сбое он печатает «Engaging core.wait», а затем завершает эксперимент. Ни сообщений об ошибках, ни предупреждений, ничего. Вот фрагмент вывода консоли с момента последнего сбоя:

Engaging core.wait
Checking keypress status
Engaging core.wait
##### Experiment ended. #####

Как видите, происходит сбой при достижении core.wait (). Это был очень последовательный образец.

Вещи, которые я пробовал:

  • Использование for-l oop вместо времени -l oop не решает проблему.

  • Изменение длительности core.wait (таким образом, изменение количества итераций l oop в секунду) не устраняет проблема.

  • Использование event.getKeys () вместо pyglet для остановки l oop тоже не решает проблему.

  • Изменение аудиобиблиотек ничего не дает; В настоящее время я использую pyo, но проблема сохраняется независимо от того, используется ли pygame или звуковое устройство.

  • Проблема, похоже, сохраняется на разных машинах.

Я использую PsychoPy3 и Python 3.6. Любая помощь приветствуется!

...