如何在pynput中实现按住按键时仅触发一次音效
解决pynput键盘按住重复触发音效的问题
问题核心是系统的按键重复机制会让on_press回调在按住按键时被多次调用,而鼠标的on_click仅在按下瞬间触发一次。要实现键盘按住只播放一次音效,只需跟踪按键的按下状态,避免重复触发。
修改后的代码
from pynput.mouse import Listener as MouseListener from pynput.keyboard import Listener as KeyboardListener import winsound # 维护已按下的按键集合,避免重复触发 pressed_keys = set() def on_press(key): # 仅当按键未被标记为按下时,播放音效并更新状态 if key not in pressed_keys: winsound.PlaySound("sound.wav", winsound.SND_ASYNC) print("Key pressed: {0}".format(key)) pressed_keys.add(key) def on_release(key): print("Key released: {0}".format(key)) # 按键释放时从集合中移除 if key in pressed_keys: pressed_keys.remove(key) def on_click(x, y, button, pressed): if pressed: winsound.PlaySound("mouse_click.wav", winsound.SND_ASYNC) print('Mouse clicked at ({0}, {1}) with {2}'.format(x, y, button)) else: print('Mouse released at ({0}, {1}) with {2}'.format(x, y, button)) keyboard_listener = KeyboardListener(on_press=on_press, on_release=on_release) mouse_listener = MouseListener(on_click=on_click) keyboard_listener.start() mouse_listener.start() keyboard_listener.join() mouse_listener.join()
关键逻辑说明
- 用
pressed_keys集合记录当前处于按下状态的按键 on_press回调中先检查按键是否不在集合内:- 不在则播放音效,并将按键加入集合,标记为已按下
- 已存在则跳过音效播放,避免重复触发
on_release回调中将按键从集合移除,确保下次按下时能正常触发音效
内容的提问来源于stack exchange,提问作者edif
相关产品推荐
相关产品推荐

