Python - 如何获得准确的按键持续时间

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

当 .exe 运行时,我想监视按键 'w' 's' 'a' 'd' 和 'space' 是否被长按(超过 1 秒)。

当同时按下两个键时,下面的代码无法准确工作,例如,按下“w”第一个键并按下 3.3 秒,按下“d”第二个 1.5 秒,按下“a”第三个 0.3 秒,同时按下“w”仍然按下.

我希望的是:

  • 您按 a 0.3 秒(按第三次)
  • 您按 d 1.5 秒(按第二次)
  • 您按 w 3.3 秒(先按)
import time
import keyboard

while True:
    start = time.perf_counter()
    a = keyboard.read_event()
    if a.name == "esc":
        break
    elif a.event_type == "down":
        b = keyboard.read_event()
        if a.name == "w" or a.name == "s" or a.name == "a" or a.name == "d" or a.name == "space":
            while not b.event_type == "up" and b.name == a.name:
                b = keyboard.read_event()
            end = time.perf_counter()
            print('You pressed', a.name, 'for', end-start, 'seconds.')
python-3.x time keyboard
1个回答
0
投票

通过

pynput
keyboard
的组合,这是可能的。

from pynput.keyboard import Key, Listener
import keyboard
import time

def on_press(key):
    if key == Key.space:
        key = 'space'
    else:
        key = key.char

    start = time.perf_counter()
    while True:
        if not keyboard.is_pressed(key):
            break

    end = time.perf_counter()
    print(f"You pressed {key.char} for {end-start} seconds.")

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

然而,当我运行这段代码时,我发现虽然它运行良好,但程序变得相当滞后。我还会注意到

end-start
返回
float
类型,当我尝试
int(end-start)
时,由于
int()
向下舍入,所以值不是很准确。

这个代码也可以工作,但是我更喜欢上面的代码,不同之处在于它只使用

keyboard

import keyboard
import time

def w_pressed():
    start = time.perf_counter()
    while True:
        if not keyboard.is_pressed('w'):
            break

    end = time.perf_counter()
    print(f"You pressed w for {end-start} seconds!")

def a_pressed():
    start = time.perf_counter()
    while True:
        if not keyboard.is_pressed('a'):
            break

    end = time.perf_counter()
    print(f"You pressed a for {end-start} seconds!")

def s_pressed():
    start = time.perf_counter()
    while True:
        if not keyboard.is_pressed('s'):
            break

    end = time.perf_counter()
    print(f"You pressed s for {end-start} seconds!")

def d_pressed():
    start = time.perf_counter()
    while True:
        if not keyboard.is_pressed('d'):
            break

    end = time.perf_counter()
    print(f"You pressed d for {end-start} seconds!")

keyboard.add_hotkey('w', w_pressed)
keyboard.add_hotkey('a', a_pressed)
keyboard.add_hotkey('s', s_pressed)
keyboard.add_hotkey('d', d_pressed)

无论哪种方式,这两个代码都会导致大量的滞后,这一点应该引起注意。我确实在 documentation 中看到了

pynput
的一些代码,它允许您专门检测按键按下时间是否超过一秒。不管怎样,不要过度依赖这段代码。

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