Failure to detect pressed key

Without ever clearing the keyboard events, once a key is pressed it will never be removed from the list. However using kb.clearEvents() will result in all events being removed, not just the released ones, so that is not really ideal in this case.

This custom code should track press / release events and only clear the event on release (tested using Windows standalone PsychoPy 2021.2.3):

# On each frame

# Get, but don't clear, pressed keys
keys = kb.getKeys(['f', 's'], waitRelease=False, clear=False)
# Get and clear key when released
keys_released = kb.getKeys(['f', 's'], waitRelease=True, clear=True)
    
if keys:
    print("pressed: ", [(k.rt, k.name) for k in keys])
    
if keys_released:
    print("released: ", [(k.rt, k.name, k.duration) for k in keys_released])

Here is example output from:

  1. press and hold ‘s’
  2. Press and hold ‘f’
  3. Release ‘s’
  4. Release ‘f’:
pressed:  [(5.245981400134042, 's')]
pressed:  [(5.245981400134042, 's')]
[....repeated every frame.....]
pressed:  [(5.245981400134042, 's')]
pressed:  [(5.245981400134042, 's')]
pressed:  [(5.245981400134042, 's'), (5.813663400011137, 'f')]
pressed:  [(5.245981400134042, 's'), (5.813663400011137, 'f')]
[....repeated every frame.....]
pressed:  [(5.245981400134042, 's'), (5.813663400011137, 'f')]
pressed:  [(5.245981400134042, 's'), (5.813663400011137, 'f')]
released:  [(5.245981400134042, 's', 1.4556524998042732)]
pressed:  [(5.813663400011137, 'f')]
pressed:  [(5.813663400011137, 'f')]
[....repeated every frame.....]
pressed:  [(5.813663400011137, 'f')]
pressed:  [(5.813663400011137, 'f')]
released:  [(5.813663400011137, 'f', 1.3918924001045525)]
2 Likes