Автор оригинала: Mathias Gatti.
Вступление
Библиотека Psychopy – это полезная платформа для разработки психологических экспериментов с использованием Python. В этом примере я покажу, как разработать базовый эксперимент, который регистрирует, сколько времени требуется, чтобы кто-то нажал клавишу, а затем я сохраню данные в виде csv-файла. Полный код можно найти здесь .
Код
Библиотеки
Сначала я импортирую библиотеки
from psychopy import visual, core, event import datetime # Used to register the date of the experiment import pandas as pd # Used to save the data as csv easily
Установка констант и глобальных переменных
# Colours gray = '#969696' black = '#000000' white = '#FFFFFF' # Window parameters resolution = [300, 300]
Определение основных функций
Окно
В psychopy вы определяете окно, в котором все экраны будут отображаться следующим образом
def window(resolution): fullScreen = False win = visual.Window(resolution,units="pix", color=gray, colorSpace='hex', fullscr=fullScreen, monitor = "testMonitor") win.setMouseVisible(False) return win
Экраны
Сейчас мы определим экраны. Здесь мы будем указывать текстовые сообщения, их стиль, цвет фона и все такое прочее. В нашей программе есть только два экрана: стартовый экран, который просит вас начать, и стоп-экран, который записывает, сколько времени вам потребовалось, чтобы нажать кнопку.
def loadInstructionsAndFlip(win): background = visual.Rect(win, width=resolution[0]+10, height=resolution[1]+10, fillColor=black, fillColorSpace='hex') msg1 = visual.TextStim(win, text="press [ q ] to exit", pos=(0.0,(-resolution[1]*0.10)), color=white, colorSpace='hex') msg2 = visual.TextStim(win, text="press [ n ] to continue", color=white, colorSpace='hex',alignHoriz='center', alignVert='center') background.draw() msg1.draw() msg2.draw() # Elements are only displayed after the flip command is executed win.flip() def loadStartScreenAndFlip(win): background = visual.Rect(win, width=resolution[0]+10, height=resolution[1]+10, fillColor=gray, fillColorSpace='hex') msg1 = visual.TextStim(win, text="press any key to start", color=white, colorSpace='hex') background.draw() msg1.draw() # Elements are only displayed after the flip command is executed win.flip()
Основная логика
Здесь мы реализуем основную логику программы. Мы создаем часы, которые измеряют время. Мы сбрасываем его на каждой итерации и каждый раз показываем каждый экран.
def startScreensAndRecordData(win): clock = core.Clock() win.clearBuffer() data = [] loadStartScreenAndFlip(win) event.waitKeys() while True: loadInstructionsAndFlip(win) clock.reset() keys = event.waitKeys(keyList=["n","q"]) for key in keys: time = clock.getTime() print("You pressed the {} key on {} seconds".format(key,round(time,3))) data.append([key,time]) if key == "q": return data else: loadStartScreenAndFlip(win) event.waitKeys()
Собрать все вместе и сохранить
Наконец мы собрали все вместе и сохранили файл в формате CSV с помощью pandas
def main(): win = window(resolution) data = startScreensAndRecordData(win) pd.DataFrame(data,columns=["Key","Time"]).to_csv('experiment_' + str(datetime.date.today()) + '.csv') print("Experiment saved as:",'experiment_' + str(datetime.date.today()) + '.csv')