Key_press not being defined

URL of experiment: RL [PsychoPy]

Description of the problem: After the experiment running on Mac and PC on Chrome, I asked a few folks to try to run the experiment on their own computers. One on a Mac using Safari got this error message:
image

I was able to reproduce it in Safari by waiting too long to respond to a trial. Knowing that was the issue, I then waited too long on purpose for a trial in Chrome and get a slightly different error:

I believe the error occurs when this code is hit:


Python

if len(key_resp.keys) == 0:
    no_resp = True
    feedback_text = "Please respond faster!"
else:
    no_resp = False
    feedback_text = ""

JS

if ((key_resp.keys.length === 0)) {
    no_resp = true;
    feedback_text = "Please respond faster!";
} else {
    no_resp = false;
    feedback_text = "";
}

key_response is defined initially as:


key_resp = new core.Keyboard({psychoJS: psychoJS, clock: new util.Clock(), waitForStart: true});

and in the trials, key_response is updated as:

    // *key_resp* updates
    if (t >= 0.0 && key_resp.status === PsychoJS.Status.NOT_STARTED) {
      // keep track of start time/frame for later
      key_resp.tStart = t;  // (not accounting for frame time here)
      key_resp.frameNStart = frameN;  // exact frame index
      
      // keyboard checking is just starting
      psychoJS.window.callOnFlip(function() { key_resp.clock.reset(); });  // t=0 on next screen flip
      psychoJS.window.callOnFlip(function() { key_resp.start(); }); // start on screen flip
      psychoJS.window.callOnFlip(function() { key_resp.clearEvents(); });
    }
    
    frameRemains = 0.0 + 1.5 - psychoJS.window.monitorFramePeriod * 0.75;  // most of one frame period left
    if (key_resp.status === PsychoJS.Status.STARTED && t >= frameRemains) {
      key_resp.status = PsychoJS.Status.FINISHED;
        }
      
    if (key_resp.status === PsychoJS.Status.STARTED) {
      let theseKeys = key_resp.getKeys({keyList: ['f', 'j'], waitRelease: false});
      _key_resp_allKeys = _key_resp_allKeys.concat(theseKeys);
      if (_key_resp_allKeys.length > 0) {
        key_resp.keys = _key_resp_allKeys[_key_resp_allKeys.length - 1].name;  // just the last key pressed
        key_resp.rt = _key_resp_allKeys[_key_resp_allKeys.length - 1].rt;
        key_resp.duration = _key_resp_allKeys[_key_resp_allKeys.length - 1].duration;
        // was this correct?
        if (key_resp.keys == corr_ans) {
            key_resp.corr = 1;
        } else {
            key_resp.corr = 0;
        }
      }
    }

I could use some eyeballs to help with code. This is how the response was defined in Builder:

Please don’t post code created by Builder. It confuses the issue when trying to debug.

If you have a keyboard response called key.resp then key_resp.keys isn’t defined until a key has been pressed.

len(key_resp.keys) with therefore given an error.

To check for no response you could simply use if not key_resp.keys

(You can translate this to JS yourself if you are using a Both component)

Apologies, just trying to be thorough.

This change did work (shown below in PsychoPy for others who might want the full copy!):

if not key_resp.keys:
    no_resp = True
    feedback_text = "Please respond faster!"
else:
    no_resp = False
    feedback_text = ""

Thank you!