Search code examples
pythonpsychopy

How to update polygon size with cumulative key press in Psychopy


I am using Psychopy to create a psychological task. For a given routine, I would like the height of a polygon (rectangle) to increase with every key press (same key every time), until it reaches the maximum number of key presses (e.g. 10). I cannot figure out how to create a loop to count number of key presses within the same routine, nor how to use this to generate a variable that will constantly update the size of the polygon.

Here is what I have tried as code in the routine which gets stuck in while loop... and I am not sure if the loop should go in the code "Before Routine" or for "Each Frame"

total_key_count = 0 
while True: 
    resp_key = event.waitKeys(keyList=['1'])  
if resp_key == '1':
   total_key_count = total_key_count + 1 
# .. or break out of the loop if reach 10
elif total_key_count == 10:
   break  

Thanks!


Solution

  • Never use event.waitKeys() in a Builder code component. Builder is structured around a drawing loop that requires updating the screen and responding to events on every screen refresh. If you call waitKeys(), you pause execution completely until a key is pressed, which will completely break Builder's temporal structure.

    In the Begin routine tab, put this:

    key_count = 0
    max_keys = 10
    

    In the Each frame tab, put this:

    key_press = event.getKeys('1')
    if key_press: # i.e. if list not empty
        key_count = key_count + 1
        if key_count <= max_keys:
            # increment the height of the stimulus by some value
            # (use what is appropriate to its units):
            your_stimulus.size[1] = your_stimulus.size[1] + 0.1
        else:
            # terminate the routine (if required)
            continueRoutine = False
    

    Note that getKeys(), unlike waitKeys() just checks instantaneously for keypresses. i.e. it doesn't pause, waiting for a key. This is fine though, as this code will run on every screen refresh, until the required number of keys have been pushed.

    Presumably you also need to save some data about the response. This would best be done in the End routine tab, e.g.

    thisExp.addData('completion_time', t) # or whatever needs recording