You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:35:48