HOWTO · Python

如何在 Python 中检测按键

了解如何使用 keyboard、pynput 和 readchar 在 Python 中检测键盘输入,包括按下与释放事件以及终端中的单键输入。

本页内容

要在 Python 中检测键盘输入,请根据输入来源选择库:keyboard 提供系统级钩子,pynput 提供按下与释放的回调,而 readchar 可在命令行程序中读取单个按键,无需等待 Enter。安装你选择的包,然后将其回调或读取循环调整为适合你的任务。以下各包专属的示例依赖第三方库,并且需要访问键盘或交互式终端,因此它们以 API 指南的形式呈现,没有捕获的输出。

在 Python 中使用 keyboard 模块检测按键

keyboard 包可以安装一个接收键盘事件的钩子。使用 python -m pip install keyboard 将它安装到运行你程序的同一个 Python 环境中。在某些操作系统上,全局键盘钩子可能需要提升的权限,或可能受到桌面环境的限制。钩子会同时接收按键按下和释放的事件;当任务是报告按键按下时,请用 event.event_type == "down" 进行筛选。典型的集成方式是使用 keyboard.hook(on_key_event) 注册回调,并使用 keyboard.wait("esc") 持续监听。当监听结束但进程继续进行其他工作时,请使用 keyboard.unhook_all() 移除钩子。让回调保持简短,以免事件处理拖慢程序的其余部分。

这个自包含的示例使用示例事件记录,展示钩子回调所使用的筛选逻辑。它不会读取物理键盘事件;如需读取物理事件,请使用上方的包集成方式。

events = [
    {"name": "a", "event_type": "down"},
    {"name": "a", "event_type": "up"},
]

for event in events:
    if event["event_type"] == "down":
        print(f"Key {event['name']} pressed")
Key a pressed

在 Python 中使用 pynput 模块检测按键

当程序需要为按键的按下与释放分别设置处理程序时,请使用 pynput。使用 python -m pip install pynput 安装它。侦听器使用 keyboard.Listener(on_press=on_press, on_release=on_release) 创建,并通过其上下文管理器或 start() 启动。在按下回调中,字符键会公开 char 值,而 Escape 等特殊键可能不会;读取该属性之前,请确认它存在且不为 None。释放回调可以将按键与 keyboard.Key.esc 比较,并返回 False 以停止侦听器。当主线程需要等待侦听器结束时,请调用 join()。这个包专属的回调流程在这里不会执行,因为所提供的运行时中没有 pynput;操作系统权限和桌面会话限制也可能影响系统输入的访问。

在 Python 中使用 readchar 模块检测按键

对于一次只需要一个按键的命令行提示,readchar 可读取按键,无需用户按下 Enter。使用 python -m pip install readchar 安装它。在循环中,调用 readchar.readkey() 同步等待终端输入,然后将返回的按键与 "q" 比较以结束循环。其他返回的按键在到达时即打印。这适用于终端交互,不适用于在另一个应用程序获得焦点时监视按键的全局钩子。方向键和其他特殊键可能以多字符序列表示,因此在处理它们时,请与终端和库所记录的值进行比较。这个包专属的交互在这里不会执行,因为所提供的运行时中没有 readchar。

结论

对于要对系统键盘事件做出反应的钩子,请选择 keyboard;当按下与释放的回调或明确的侦听器生命周期控制适合程序时,请选择 pynput;对于简单的单键命令行提示,请选择 readchar。前两者会侦听提示之外的事件,并且可能依赖操作系统权限。readchar 从当前活动的终端读取,不提供全局监视。将所选包安装到运行你脚本的环境中,并选择明确的停止条件,例如 Escape 或 q,让侦听器或读取循环能以可预期的方式结束。