2016-12-06 15 views
1

Я хочу создать сценарий, который измеряет, как быстро участник должен нажимать клавишу ввода или пробел, только когда они слышат звуки 2/30 из звуковых файлов. Поэтому несколько раз пользователю не нужно ничего нажимать, и сценарий все равно переходит к следующему звуковому файлу. Как мне это сделать? То, что я сейчас это: (вместо звуковых файлов, у меня есть текст атм.):Сценарий Python не работает ?: Воспроизведение звука, измерение времени реакции

# Grounding of Words Experiment # 

#Import libraries 
import re 
import glob 
from psychopy import sound, visual, event, data, core, gui # imports a module for visual presentation and one for controlling events like key presses 


# ID, age, gender box display 
myDlg = gui.Dlg(title="Experiment") #, pos=(400,400) 
myDlg.addField('ID:') 
myDlg.addField('Age:') 
myDlg.addField('Gender:', choices = ['Female', 'Male']) 
myDlg.show()#you have to call show() for a Dlg 
if myDlg.OK: 
    ID = myDlg.data[0] 
    Age = myDlg.data[1] 
    Gender = myDlg.data[2] 
else: 
    core.quit() 

trial=0 

#Creates the outfile, that will be the file containing our data, the name of the file, as saved on the computer is the filename 
out_file="Grounding_experiment_results.csv" 
#Creates the header for the data 
header="trial,ID,Gender,Age,Word,rt,SpaceKlik\n" 
#opens the outfile in writemode 
with open(out_file,"w") as f: 
    f.write(header)#writes the header in the outfile 


# define window 
win = visual.Window(fullscr=True) # defines a window using default values (= gray screen, fullscr=False, etc) 

# Instruction box display 

def instruct(txt): 
    instructions = visual.TextStim(win, text=txt, height = 0.05) # create an instruction text 
    instructions.draw() # draw the text stimulus in a "hidden screen" so that it is ready to be presented 
    win.flip() # flip the screen to reveal the stimulus 
    event.waitKeys() # wait for any key press 

instruct(''' 
Welcome to the experiment! 

You will be hearing different words. 
Whenever you hear the word "Klik" and "Kast" please press the left mouse button. 
Whenever you hear any other word - do nothing. 
Try to be as fast and accurate as possible. 
Please put on the headphones. 
The experiment will take 5 minutes. 

Press any key to start the experiment''') 

# Play sound 

# Function that makes up a trial 

trial(word): 
    global trial 
    trial += 1 
    if word in ["Klik", "Press", "Throw"]: 
     condition = "press" 
    else : 
     condition = "no_press" 
    event.clearEvents() 
    for frame in range(90): 
     text = visual.TextStim(win, text=word, height = 0.05) 
     text.draw() # draw the text stimulus in a "hidden screen" so that it is ready to be presented 
     time_start=win.flip() 
    try: 
     key, time_key=event.getKeys(keyList=['space', 'escape'], timeStamped = True)[0] # wait for any key press 
    except IndexError: 
     key = "0" 
     rt = "NA" 
    else: 
     if key=='escape': 
       core.quit() 
     rt = time_key - time_start 
    if key == "space" and condition=="press": 
     accuracy = 1 
    elif key == "0" and condition=="no_press": 
     accuracy = 1 
    else: 
     accuracy = 0 
    with open(out_file,"a") as f: 
     f.write("{},{},{},{},{},{},{},{}\n".format(trial,ID,Gender,Age,word,accuracy,rt,SpaceKlik)) 

# s = sound.Sound('sound.wav') 
# s.play() 

# Register space bar press or mouse click 

# Measure reaction time 

# Check to see if answer is correct to sound - certain sound files are "klik". Others "kast", "løb", "sko" and so on 

# Write csv logfile with coloumns: "ID", "Gender", "Word", "Correct/incorrect", "Reaction time", "Space/click" 

Я все бегут в PsychoPy в конце концов. Заранее благодарю вас за вашу любезную помощь.

+0

Как общий совет, избегайте 'проб'' в качестве глобальной переменной. Просто добавьте его за пределы функции 'trial()' и передайте его в качестве второго параметра функции. Точно так же не создавайте текстовый стимул каждый раз, когда вы запускаете функцию инструкции (это дорогостоящая операция). Создайте его один раз и передайте текстовый стимул функции вместе с новым содержимым текста. Это гораздо более серьезная проблема в вашей пробной функции, где текстовый стимул повторно создается на каждом кадре. Это очень неэффективно и может вызвать проблемы с синхронизацией. –

ответ

0

Есть проблемы с вашим отступом, так что не все работает в пробной функции на соответствующем уровне. Вероятно, вы можете удалить обработку исключений, чтобы более точно проверить, был ли получен ответ. Затем используйте предложение else: в цикле for, чтобы обработать то, что произойдет, если цикл завершен, но клавиша не была нажата. Это позволяет избежать необходимости обрабатывать логику отсутствия ответа, возникающего на любом заданном фрейме (что может не означать ничего, если ответ произойдет вскоре после этого).

Что-то вроде этого общего псевдокоде:

# define window 
win = visual.Window(fullscr=True) 

# function to draw instructions (probably overkill unless run more than once) 
def instruct(instructions = 'xxx'): 
    # as you have above 

# function to run each trial 
def trial(number = -999, sound_name = 'A'): 

    sound = Sound.sound(sound_name) 

    if sound_name in ["Klik.wav", "Press.wav", "Throw.wav"]: 
     condition = "press" 
    else: 
     condition = "no_press" 

    event.clearEvents() 

    sound.play() 

    for frame in range(90): 

     time_start = win.flip() 

     keys = event.getKeys(keyList=['space', 'escape'], timeStamped = True) 
     if keys: # if a non-empty list returned: 
      key, time_key = keys[0] 
      rt = time_key - time_start 

      sound.stop() # ready to start next trial immediately 

      if key == 'escape': 
       core.quit() 

      if condition == "press": 
       return {'accuracy':1, 'rt':rt} 
      else: 
       return {'accuracy':0, 'rt':rt} 

    else: # the loop ended without a key press 
     if condition == "press": 
      return {'accuracy':0, 'rt':'NA'} 
     else: 
      return {'accuracy':1, 'rt':'NA'} 

#### 
# run the experiment: 
#### 

#### 
# show the instructions: 
#### 
instruct('some instructions') 

#### 
# run the trials: 
#### 
for trial_num in range(10): 

    # run each trial and get the results. 
    # I'm not sure where you're getting your sound values 
    # but they could be indexed from a list using the trial number: 
    result = trial(number=trial_num, sound_name=sound_names[trial_num]) 

    # then save the values from the returned dictionary to a file 
0

Хорошо, хорошо - спасибо! Теперь я продолжаю пытаться разработать свой скрипт. Я добавил пробный список, и теперь я не слишком уверен, что делать. Мой сценарий выглядит так:

# Grounding of Words Experiment # 

# -*- coding: utf-8 -*- 

#Import libraries 
import re 
import glob 
from psychopy import sound, visual, event, data, core, gui # imports a module for visual presentation and one for controlling events like key presses 
import ppc 

# ID, age, gender box display 
myDlg = gui.Dlg(title="Experiment") #, pos=(400,400) 
myDlg.addField('ID:') 
myDlg.addField('Age:') 
myDlg.addField('Gender:', choices = ['Female', 'Male']) 
myDlg.show()#you have to call show() for a Dlg 
if myDlg.OK: 
    ID = myDlg.data[0] 
    Age = myDlg.data[1] 
    Gender = myDlg.data[2] 
else: 
    core.quit() 

# define window 
win = visual.Window(fullscr=True) 


# function to draw instructions (probably overkill unless run more than once) 
def instruct(txt): 
    instructions = visual.TextStim(win, text=txt, height = 0.05) # create an instruction text 
    instructions.draw() # draw the text stimulus in a "hidden screen" so that it is ready to be presented 
    win.flip() # flip the screen to reveal the stimulus 
    event.waitKeys() # wait for any key press 
    # as you have above 


# function to run each trial 
def trial(number = -999, sound_name = 'A'): 

    sound = Sound.sound() 

    if sound_name in ["dog-howling.wav"]: 
     condition = "press" 
    else: 
     condition = "no_press" 

    event.clearEvents() 

    sound.play(sound_name) 

    for frame in range(90): 

     time_start = win.flip() 

     keys = event.getKeys(keyList=['space', 'escape'], timeStamped = True) 
     if keys: # if a non-empty list returned: 
      key, time_key = keys[0] 
      rt = time_key - time_start 

      sound.stop() # ready to start next trial immediately 

      if key == 'escape': 
       core.quit() 

      if condition == "press": 
       return {'accuracy':1, 'rt':rt} 
      else: 
       return {'accuracy':0, 'rt':rt} 

    else: # the loop ended without a key press 
     if condition == "press": 
      return {'accuracy':0, 'rt':'NA'} 
     else: 
      return {'accuracy':1, 'rt':'NA'} 
#### 
# define triallist 

trial_list = [] 
conditions = ["klik", "notklik"] 
sounds = ["dog-howling.wav", "sound2.wav", "sound3.wav"] 
for condition in conditions: 
    for sound in sounds: 
     # Add a dictionary for every trial 
      trial_list += [{ 
       'ID': ID, 
       'age': AGE, 
       'gender': GENDER, 
       'condition': condition, 
       'sounds': sound, 
       'rating': '', 
       'rt': '' 
        }] 

# Randomize order 
trial_list = sample(trial_list, len(trial_list)) 

# Add trial numbers 
for i, trial in enumerate(trial_list): 
    trial['no'] = i + 1 # start at 1 

# write file 

#### 
# run the experiment: 
#### 

#### 
# show the instructions: 
#### 
instruct('''Welcome to the experiment! 

You will be hearing different words. 
Whenever you hear the word "Klik" and "Kast" please press the left mouse button. 
Whenever you hear any other word - do nothing. 
Try to be as fast and accurate as possible. 
Please put on the headphones. 
The experiment will take 5 minutes. 

Press any key to start the experiment''') 

#### 
# run the trials: 
#### 
for trial_num in range(10): 

    # run each trial and get the results. 
    # I'm not sure where you're getting your sound values 
    # but they could be indexed from a list using the trial number: 
    result = trial(number=trial_num, sound_name=sound_names[trial_num]) 

    # then save the values from the returned dictionary to a file+ 

#Creates the outfile, that will be the file containing our data, the name of the file, as saved on the computer is the filename 
#out_file="Grounding_experiment_results.csv" 
#Creates the header for the data 
#header="trial,ID,Gender,Age,Word,rt,SpaceKlik\n" 
#opens the outfile in writemode 
#with open(out_file,"w") as f: 
# f.write(header)#writes the header in the outfile 
+0

Вам действительно нужно заглянуть в класс «TrialHandler». Подайте пробный список на это, и он автоматически обработает отслеживание пробных номеров, сохранение данных и т. Д. В меню «Демо» в представлении «Кодировщик психопата» есть несколько примеров. –