2016-12-06 67 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'作为全局变量。只需在'trial()'函数之外递增它并将其作为第二个参数传递给该函数。同样,每次运行指令功能时都不要创建文本激励(这是一个耗时的操作)。创建一次,并将文本刺激传递给函数,以及新的文本内容。在您的试用函数中,这是一个更大的问题,在每个帧上都会重新实例化文本刺激。这非常耗时且可能导致计时问题。 –

回答

0

您的缩进存在问题,因此并非所有内容都在适当级别的试用功能中运行。您可能会放弃异常处理,以更直接地检查是否已做出响应。然后利用for循环的else:子句来处理循环完成但未按下任何键时发生的情况。这避免了必须处理任何给定帧上发生的无响应的逻辑(如果响应很快就会发生,这可能不代表任何意义)。

像这样的东西一般伪代码:

# 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'类。将您的试用清单提供给它,并自动处理跟踪试用号码,保存数据等。 PsychoPy的编码器视图中的演示菜单下有几个示例。 –