Unable to check keyboard response ('list index out of range')


sallicap

1m

Hi! I am coding an n-back task which checks whether a response is correct from right/left keys, my code keeps throwing up 2 errors:

  1. When the second letter is presented (my code skips all keypresses for the first letter), my code immediately goes to line A (I’ve marked this part in my code below). It shouldn’t even run this line as this happens even when pressing left/right and that part is if a resposne is None. Why does my experiment not detect keypresses?
  2. When running those lines, if I remove those lines assining “None” to keys_n.rt and such I get the error
keys_n[0].rt = 0
IndexError: list index out of range

Otherwise if I run it as is with the lines assigning None/0 to keys_n.rt and keys_n.name, I get the following error:

    keys_n[0].rt = 0
AttributeError: 'str' object has no attribute 'rt'

Finally, if I keep the code just as keys_n.rt and keys_n.name (for data saving and such), I get the following error:

    thisExp.addData('N back RT',keys_n.rt)
AttributeError: 'list' object has no attribute 'rt'

The full snippet of code is below:

for i in nback_list1:
    for j in i:
        
        nback1_start = core.getAbsTime()
        
        if kb.getKeys(keyList=['escape']):
            shutdown()
            
        thisLetter = nback_letters1.index(j)
        corrAns = nback_corrAns1[thisLetter]
        letter_present = TextStim(win, text=nback_letters1[thisLetter], height=0.5)
        
        fixation_cross(0.5)
        
        if thisLetter != 0:
                          
            # Use clock-based timing
            nback_clock.reset()
            nback_kb1.clock.reset()
            
            start_marker_sent = False
            
            while nback_clock.getTime() < 2:
                if nback_clock.getTime() < 0.5:
                    letter_present.draw()
                    if start_marker_sent == False:
                        win.callOnFlip(port.write('F'.encode()))
                        start_marker_sent = True
                else:
                    blank_.draw()
        
                win.flip()
                      
                keys_n = nback_kb1.getKeys(keyList = ['left', 'right']) 
                
                # Get responses 
                if len(keys_n) > 0:
                    if corrAns == keys_n[0].name:
                        answer = 1
                    elif corrAns != keys_n[0].name:
                        answer = 0
                        
                elif keys_n in ['', [], None]:
                    answer = 'None'
                    keys_n = ['None']
                    keys_n[0].rt = 0
                    keys_n[0].name = 'None'
                
                else:
                    answer = 'error'
            
            port.write('f'.encode())
                
            # Saving trial data
            thisExp.addData('N back RT',keys_n[0].rt)
            thisExp.addData('Stimulus presented',thisLetter)
            thisExp.addData('N back response',answer)
            thisExp.addData('N back start',nback1_start)
            thisExp.nextEntry()
            
            # Saving response data
            nback_results = nback_results.append({'Trial number': i, 
                                                    'Stimulus presented': thisLetter,
                                                    'Key pressed': keys_n[0].name,
                                                    'Response': answer,
                                                    'Reaction time': keys_n[0].rt})
            
            nback_results['Trial number'] = i
            nback_results['Stimulus presented'] = thisLetter
            nback_results['Key pressed'] = keys_n[0].name 
            nback_results['Response'] = answer
            nback_results['Reaction time'] = keys_n[0].rt
        else:
            nback_clock.reset()
            while nback_clock.getTime() < 2:
                if nback_clock.getTime() < 0.5:
                    letter_present.draw()
                else:
                    blank_.draw()
                win.flip()

I would appreciate any help, thank you! :slight_smile: