当 .exe 运行时,我想监视按键 'w' 's' 'a' 'd' 和 'space' 是否被长按(超过 1 秒)。
当同时按下两个键时,下面的代码无法准确工作,例如,按下“w”第一个键并按下 3.3 秒,按下“d”第二个 1.5 秒,按下“a”第三个 0.3 秒,同时按下“w”仍然按下.
我希望的是:
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.')
通过
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
的一些代码,它允许您专门检测按键按下时间是否超过一秒。不管怎样,不要过度依赖这段代码。