有没有办法让 pynput.keyboard 对每次按下(短按和长按)只计数一次,并且可以同时按住多个键?

问题描述 投票:0回答:2

我尝试用 python 制作简单的按键计数器,但发现了一个问题。当我按住某个键一段时间时,它开始快速计数,因为我按住了该键。

from pynput.keyboard import Listener
n = 0
def on_press(key):
    global n
    n += 1
def on_release(key):
    pass
with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

所以我做了一把锁,当我按住钥匙时,它无法计数。

from pynput.keyboard import Listener
pressed = False
n = 0
def on_press(key):
    global n, pressed
    if pressed == False:
        n += 1
        pressed = True
def on_release(key):
    global pressed
    pressed = False
with Listener(on_press=on_press, on_release=on_release) as listener:
        listener.join()

但是现在当我开始打字或玩游戏时,它不会计算每次按下的次数,因为我有时同时按住 2 个键,所以 1 个键不计算在内。

我尝试在按住按键 0.5 秒后锁定,因此它会计算我打字时的每次按键,但当我按住多个按键超过 0.5 秒时仍然存在问题(当我按住多个按键超过 0.5 秒时,只算了1)。

有没有办法让它对每次按下(无论时间长短)只计数一次,并且可以同时按住多个键?

python pynput
2个回答
0
投票

您的问题可以通过跟踪数组中当前按下的按钮来解决。

from pynput.keyboard import Key, Listener

keys_currently_pressed = []
n = 0

def on_press(key):
    global n
    if key not in keys_currently_pressed:
        keys_currently_pressed.append(key)
        n += 1
        print(key, 'pressed')

def on_release(key):
    global n
    if key in keys_currently_pressed:
        keys_currently_pressed.remove(key)
    print(key, 'released')
    if key == Key.esc:
        print("You pressed", n, "keys")
        return False

with Listener(on_press=on_press, on_release=on_release) as listener:
        listener.join()

0
投票

我发现了一个用nextjs写的类似程序,希望对你有启发。

键盘计数器及其github

© www.soinside.com 2019 - 2024. All rights reserved.