Получение свободного ввода текста (строки) от участника

Кажется глупым вопросом, но я не могу найти в Документах, как получить ввод текста от пользователя в эксперименте PsychoPy Builder.

например, если бы у меня был компонент Text для отображения сообщения «Как тебя зовут?»

Я хочу получить текстовый ответ (с эхом ключа на экране) и сохранить его в файле результатов.

Придется ли мне переходить к коду и использовать диалоговое окно?

Спасибо


person jacanterbury    schedule 09.10.2014    source источник


Ответы (2)


Спасибо, Майкл. Казалось, что это сработает, но я надеялся, что что-то более простое передаст исследователю, не занимающемуся программированием, поэтому я поиграл и придумал следующее, которое удовлетворяет моим требованиям.

Я вставил код в GitHub здесь https://github.com/jacanterbury/PsychoPy-snippets

но в основном он делает следующее:

Текстовое поле TextStim содержит следующее:

$(word + '\n' + inputText)

Объект кода в том же цикле имеет следующее:

Начать эксперимент:

inputText = ""

Начать рутину:

theseKeys="" 
shift_flag = False
text_3.alignHoriz ='left'

Каждый кадр:

n= len(theseKeys)
i = 0
while i < n:

    if theseKeys[i] == 'return':
        # pressing RETURN means time to stop
        continueRoutine = False
        break

    elif theseKeys[i] == 'backspace':
        inputText = inputText[:-1]  # lose the final character
        i = i + 1

    elif theseKeys[i] == 'space':
        inputText += ' '
        i = i + 1

    elif theseKeys[i] in ['lshift', 'rshift']:
        shift_flag = True
        i = i + 1

    else:
        if len(theseKeys[i]) == 1:
            # we only have 1 char so should be a normal key, 
            # otherwise it might be 'ctrl' or similar so ignore it
            if shift_flag:
                inputText += chr( ord(theseKeys[i]) - ord(' '))
                shift_flag = False
            else:
                inputText += theseKeys[i]

        i = i + 1

Завершить процедуру:

# let's store the final text string into the results finle...
thisExp.addData('inputText', inputText)
inputText=""

Файл результатов в папке данных показывает отдельные нажатые клавиши, а также окончательную строку.

Надеюсь, код достаточно понятен. Единственное, что может быть неочевидным, это то, что символы нижнего и верхнего регистра в ascii разнесены на 1:1 и 32, что является значением одного пробела (например, в ASCII 'a' = 'A' + ' ' )

Не стесняйтесь комментировать/улучшать его (в настоящее время он не обрабатывает SHIFT-LOCK, но это должно быть легко исправить)

Было бы неплохо поместить его в библиотеку, чтобы весь код на вкладке «Каждый кадр» можно было заменить одной строкой.

person jacanterbury    schedule 16.10.2014
comment
Проголосуйте за использование (и, следовательно, показ меня) 'continueRoutine = False` - person Novak; 05.12.2014

Есть две альтернативы: (1) используйте диалоговое окно, как вы упомянули. Вам нужно либо сделать так, чтобы главное окно не было полноэкранным, либо временно свернуть его, чтобы диалоговое окно было видно впереди.

(2) Обрабатывайте нажатия клавиш самостоятельно и отражайте их на экране в текстовом компоненте. Да, было бы неплохо, если бы это было встроено, но сейчас это не так. Прочитайте эту обширную ветку, чтобы узнать, как включить этот подход в Builder: https://groups.google.com/forum/#!topic/psychopy-users/lE_bTMHUAoU

Также см. эту тему: https://groups.google.com/forum/#!topic/psychopy-users/DGXkU-31MPg с указателем на некую кодовую форму Alex Holcombe.

person Michael MacAskill    schedule 09.10.2014