如何使用pynput在特定按键事件后捕获额外击键 实现实时脏话检测
pynput 主动脏话监听器实现方案
你完全不需要创建多个监听器,仅通过全局状态标记就能实现两种状态的切换,全程仅运行1个监听器,无冗余资源开销,也不会出现逻辑冲突。
实现逻辑
- 全局声明两个变量:
is_recording(布尔值,标记当前是否需要记录按键)、input_buffer(列表,临时存储用户输入的字符) - 监听器全程保持运行,未进入录制状态时仅响应「Enter开启录制」操作,其余按键直接忽略,不会产生多余计算
- 进入录制状态后处理三类按键:
- 普通字符:追加到
input_buffer存储,可实时传入脏话过滤器做检测,触发违规时直接弹出提示 - Enter键:结束录制,清空缓冲区,
is_recording改回False,可根据需求执行提交/丢弃操作 - 退格、Shift等功能键:按需做缓冲区裁剪/忽略处理即可
- 普通字符:追加到
参考代码
from pynput.keyboard import Key, Listener # 全局状态 is_recording = False input_buffer = [] # 脏话词库可自行扩展 BAD_WORDS = {"xxx", "yyy"} def check_bad_words(content): # 脏话检测逻辑,可替换为更精准的过滤算法 for word in BAD_WORDS: if word in content.lower(): print("检测到违规内容,请调整表述后再发送") return True return False def on_press(key): global is_recording, input_buffer # 未进入录制状态,仅响应Enter开启录制 if not is_recording: if key == Key.enter: is_recording = True input_buffer.clear() return # 已进入录制状态,处理按键 if key == Key.enter: # 按下Enter结束录制 is_recording = False full_content = ''.join(input_buffer) if not check_bad_words(full_content): # 无违规内容,可在此处添加提交逻辑 print("内容合规,已提交") input_buffer.clear() return if key == Key.backspace: # 处理退格 if input_buffer: input_buffer.pop() return # 处理普通字符 try: input_buffer.append(key.char) # 实时检测可选,不需要实时检测的话可以放到结束录制时统一检查 check_bad_words(''.join(input_buffer)) except AttributeError: # 其他功能键直接忽略 pass def on_release(key): if key == Key.esc: # 停止整个监听器 return False if __name__ == "__main__": with Listener(on_press=on_press, on_release=on_release) as listener: listener.join()
方案优势
- 全程仅运行1个监听器,没有多监听器的逻辑冲突,资源消耗极低,哪怕每秒几十次按键操作也不会有性能问题
- 不需要调用
input(),完全避免了内置输入函数和监听器的冲突问题,可灵活自定义提交/丢弃逻辑 - 支持两种检测模式:实时输入检测、提交前统一检测,可根据需求自行调整
内容的提问来源于stack exchange,提问作者Smorgleberry
相关产品推荐
相关产品推荐

