Detect if key was pressed once

Question:

I wanted to do an action, as soon as my f key is pressed. The problem is that it spams the action.

import win32api

while True:
    f_keystate = win32api.GetAsyncKeyState(0x46)

    if f_keystate < 0:
        print("Pressed!")

I would like this without “Pressed!” being spammed but only printed once.

Asked By: Dom

||

Answers:

You need a state variable that will keep track of whether the key has been pressed after it’s been released.

f_pressed = False

while not f_pressed:
    f_pressed = win32api.GetAsyncKeyState(0x46) < 0

print("Pressed!")
Answered By: Samwise

Because in the while loop, when the f key is pressed, GetAsyncKeyState will detect that the f key is always in the pressed state. As a result, the print statement is called repeatedly.

Try the following code, you will get the result you want:

import win32api

while True:
    keystate = win32api.GetAsyncKeyState(0x46)&0x0001
    if keystate > 0:
       print('F pressed!')
Answered By: Strive Sun

I’m super late, but I ran across the same problem myself when using the keyboard module. Here’s the solution I found, and yes, it is asynchronous.

    if keyboard.is_pressed('f'):
        if checksPressed == 0:
            # run code
        checksPressed += 1
    else:
        checksPressed = 0

or for win32api

if win32api.GetAsyncKeyState(0x46) < 0:
        if checksPressed == 0:
            # run code
        checksPressed += 1
    else:
        checksPressed = 0
Answered By: ShadowProgrammer
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.