# How to end routine only if a key pressed for a certain duration?

**URL:** <https://discourse.psychopy.org/t/how-to-end-routine-only-if-a-key-pressed-for-a-certain-duration/33501>\
**Category:** Online experiments\
**Tags:** release\
**Created:** [February 24, 2023, 1:24am UTC](https://discourse.psychopy.org/t/how-to-end-routine-only-if-a-key-pressed-for-a-certain-duration/33501 "2023-02-24T01:24:59Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![emregurbuz](https://avatars.discourse-cdn.com/v4/letter/e/a6a055/32.png) [@emregurbuz](https://discourse.psychopy.org/u/emregurbuz)\
**Post date:** [February 24, 2023, 1:24am UTC](https://discourse.psychopy.org/t/how-to-end-routine-only-if-a-key-pressed-for-a-certain-duration/33501/1 "2023-02-24T01:24:59Z")

</div>

Hi everyone!

**Description of the problem:** I want to prepare an experiment in which a specific key should be pressed long enough to continue to the following routine. I could build the experiment on PsychoPy however I am struggling to run it online.

**What I want to achieve?** There will be a fixation (+) and then the space key should be pressed for 1 second or longer. Only if the space key is pressed for a minimum 1 second, the routine should end and the next routine with a new target (an image) should start.

**What did I do to make it work?** I created a keyboard component with custom code as follows for Python and Javascript

```auto
#Begin Routine in Py
my_keyboard = keyboard.Keyboard()
keys = []
keys_released = []

```

```auto
//Begin Routine in JS
my_keyboard = new core.Keyboard({psychoJS: psychoJS, clock: new util.Clock(), waitForStart: true}); 
keys = [];
keys_released = [];

```

and then I created a list for key presses (keys) and another list for key releases (keys\_released). In each frame tab, I check constantly whether there is a key press but not a key release (meaning that the key is still being pressed). If the space key is pressed for a minimum of 1 second, a new target should be defined/appear. However, if I press for a short time, the key press should be cleared and the code needs to wait for me to make another space press.

Here is the python code:

```auto
keys = my_keyboard.getKeys(keyList=['space'], waitRelease=False, clear=False)
keys_released = my_keyboard.getKeys(keyList=['space'], waitRelease=True, clear=False)

if len(keys) and not len(keys_released): #If I press "space" but do not release my finger
   pressing_time = [(kk.rt) for kk in keys] # get the time that I pressed "space"
   pressed_duration = t - pressing_time[0] #how many milliseconds have been passed since the key press
   print("been pressed",pressed_duration)
   if pressed_duration >= 1: # If I press space for a minimum 1 second , define the new target
       target_now = "my_new_target_name"
   elif pressed_duration < 1: # If I press space less than 1 second target should be the same
       target_now = target_now
elif len(keys) and len(keys_released): # If I remove my finger from the space key
   if pressed_duration > 1: # If I pressed longer than 1 second, end the routine 
       RTrelease = t
       continueRoutine = False
   elif pressed_duration < 0.75: # If I pressed shorter than 1 second clear my key presses and wait for a new space press (which needs to be 1 second or longer)
       my_keyboard.clearEvents()

```

I tried to used **Auto → JS** , however, the code that is created automatically does not work online. I am a little bit stuck at the moment.

Should I modify my Python code to be able to translate it online?

Or what would be the Javascript equivalent of the following lines?  
—my\_keyboard.getKeys(keyList=[‘space’], waitRelease=True, clear=False)  
—pressing\_time = [(kk.rt) for kk in keys]

I have seen a few similar topics in the forum however, I still could not find a solution for my problem. For instance, I have tried the _**keys = event.getKeys()**_. But as far as I understand it collects any key presses but not one specific one.

Thanks in advance for your answers and help!

Cheers
