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,讓監聽器或讀取迴圈能以可預期的方式結束。