Заявление об ограничении ответственности: я не писал здесь раньше. Я пытался следовать руководству по вопросам, но, пожалуйста, сообщите мне, если чего-то очевидного не хватает.
В любом случае, я пытаюсь создать эксперимент, в котором участнику показывают стимул, он видит некоторые инструкции, затем нажмите и удерживайте ПРОБЕЛ, чтобы записать словесный ответ. Цель состоит в том, чтобы остановить запись, когда участник поднимет клавишу ПРОБЕЛ. Для этого я установил 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. Любая помощь приветствуется!