Recording keyboard responses

OS : macOS Mojave
PsychoPy version : v2020.1.2
Standard Standalone? Yes
What are you trying to achieve?:
Record five keyboard press. And present live feedback on key presses. End routine when 5 keys have been pressed.

What did you try to make it work?:
I have a builder keyboard component named ‘key_resp’ and a text component named ‘text’ to display the live feedback text.

The following is on ‘each frame’ of the code component.

if key_resp.status == STARTED and not waitOnFlip:
        if (len(_key_resp_allKeys)) >= 5:
                core.checkPygletDuringWait = False
                core.wait(0.3)
                continueRoutine = False
       
        theseKeys = key_resp.getKeys(keyList=alphabets, waitRelease=False)
        _key_resp_allKeys.extend(theseKeys)
        
        if len(_key_resp_allKeys):
            key_resp.keys = [key.name for key in _key_resp_allKeys]  # storing all keys
            key_resp.rt = [key.rt for key in _key_resp_allKeys]

            if len(theseKeys):
                #typedWord = typedWord + key_resp.keys[-1] 
                #typedWord = typedWord + theseKeys[0].name
                typedWord = typedWord + key_resp.keys[abs(len(_key_resp_allKeys)-1)]
                
                text.text=typedWord

What specifically went wrong when you tried that?:
This largely works.
key_resp.keys = [key.name for key in _key_resp_allKeys]
This line above seems to capture all the keys typed, even when typed really quickly.

However,

#typedWord = typedWord + key_resp.keys[-1] 
#typedWord = typedWord + theseKeys[0].name
typedWord = typedWord + key_resp.keys[abs(len(_key_resp_allKeys)-1)] 

All three options here for joining the keys presses to ‘typedWord’ seem to miss some keys if they were typed simultaneously or in very quick succession, ~100ms. I need the keys here to join as a string as supposed to a list. Can anyone suggest a fix?

Minor 2nd Question: I’m trying to stop collecting keyboard responses at the 5th keypress. If I typed (more than 5 keys) really quickly, sometimes it is not able to endRoutine before it realises that there have been 5 key presses. At the same time, I also needed the live feedback to display all 5 key presses before the routine ended. Hence the 300ms wait.

We intend to eventually have a Pavlovia version of this experiment.

Some examples of the problem in the output file:
typedWord // key_resp// key_rt
roya // [‘r’, ‘o’, ‘y’, ‘a’, ‘l’] // [0.7027494410285726, 0.8150179670192301, 1.0176382460049354, 1.0513858360354789, 1.2200069150421768]

mids // [‘m’, ‘i’, ‘d’, ‘t’, ‘s’] // [0.5428984200116247, 0.7229219200089574, 0.779157450015191, 1.0041551369940862, 1.0155205769697204]

ears // [‘y’, ‘e’, ‘a’, ‘r’, ‘s’] // [0.869883059989661, 0.9486287219915539, 1.1286048580077477, 1.2187204079818912, 1.376174220989924]

ksjhi // [‘k’, ‘s’, ‘d’, ‘j’, ‘h’, ‘e’, ‘r’, ‘h’, ‘o’, ‘i’] // [2.2272050339961424, 2.2383754740003496, 2.2496499109547585, 2.2612062619882636, 2.3284927969798446, 2.4296111239818856, 2.440830361971166, 2.5308294039568864, 2.609585241996683, 2.633057287952397]