Введение
Автоматизация ввода и обработка событий клавиатуры — важные аспекты как для тестирования приложений, так и для создания пользовательских скриптов и утилит. Когда нужно программно нажимать клавиши, реагировать на ввод или создавать свои горячие клавиши, Python предоставляет отличную библиотеку — keyboard.
keyboard
— это мощный кроссплатформенный инструмент, позволяющий управлять клавиатурой на уровне операционной системы. Она работает как слушатель и генератор событий: можно как перехватывать, так и эмулировать ввод с клавиатуры.
В этой статье мы разберем библиотеку keyboard от установки до продвинутых сценариев, включая создание макросов, глобальные горячие клавиши, логгеры и обработку комбо-команд.
Основная часть
Установка и требования
pip install keyboard
На Linux требует root-доступ. На macOS частично ограничена и требует дополнительных разрешений.
Основные функции библиотеки
Библиотека работает в двух направлениях:
-
Эмуляция нажатий клавиш
-
Реакция на реальные нажатия пользователя
Эмуляция клавиш
keyboard.write(text)
Ввод текста как с клавиатуры.
import keyboard
keyboard.write("Hello, world!")
keyboard.press(key)
/ keyboard.release(key)
Нажатие и отпускание клавиш вручную.
keyboard.press("ctrl")
keyboard.press("c")
keyboard.release("c")
keyboard.release("ctrl")
keyboard.send(keys)
Нажатие комбо-команды.
keyboard.send("ctrl+shift+n")
Работа с горячими клавишами
keyboard.add_hotkey(hotkey, callback)
Регистрирует глобальную горячую клавишу.
def launch():
print("Hotkey triggered!")
keyboard.add_hotkey("ctrl+alt+h", launch)
keyboard.wait("esc")
keyboard.remove_hotkey(hotkey)
Удаляет зарегистрированную комбинацию.
Множественные комбинации
keyboard.add_hotkey("ctrl+alt+a, ctrl+alt+b", lambda: print("Combo!"))
Реакция на события
keyboard.on_press(callback)
Вызывается при любом нажатии.
keyboard.on_release(callback)
Вызывается при отпускании клавиши.
Пример
def on_key(event):
print(f"{event.name} pressed")
keyboard.on_press(on_key)
keyboard.wait("esc")
Работа с событиями
keyboard.is_pressed(key)
Проверка, нажата ли клавиша.
if keyboard.is_pressed("space"):
print("Space is down")
keyboard.read_event()
Блокирующее чтение одного события.
keyboard.read_key()
Ожидает нажатия клавиши и возвращает её имя.
Пример
key = keyboard.read_key()
print(f"You pressed: {key}")
Запись и воспроизведение макросов
keyboard.record(until='esc')
Записывает все действия до нажатия определённой клавиши.
keyboard.play(events)
Воспроизводит список записанных событий.
events = keyboard.record(until="enter")
keyboard.play(events)
Работа с логами и временными метками
Каждое событие в record()
содержит:
-
имя клавиши
-
время события
-
тип (нажатие/отпускание)
Можно анализировать пользовательскую активность или строить метрики.
Безопасность и fail-safe
keyboard.wait(key)
Блокирует выполнение до нажатия клавиши.
keyboard.clear_all_hotkeys()
Очищает все зарегистрированные горячие клавиши.
Прерывание
try:
keyboard.wait("esc")
except KeyboardInterrupt:
print("Stopped.")
Практические кейсы
Макросы и боты
Автоматизация рутины, автокликеры, игровые макросы.
Горячие клавиши для управления окнами
Создание своих сочетаний для скриптов, интерфейсов.
Утилиты для пользователей
Быстрое переключение громкости, открытие программ и веб-сайтов.
GUI-тестирование
Проверка ввода, поведения клавиш, имитация сценариев пользователя.
Интеграции с другими библиотеками
-
PyAutoGUI — совместное управление мышью и клавиатурой
-
PyQt5/PySide — сочетания в UI-приложениях
-
Pandas/Loguru — логирование и анализ пользовательских событий
Ограничения и отладка
-
На Linux требуется root для захвата клавиатуры
-
macOS требует accessibility-доступ
-
В виртуальных средах (RDP) работает нестабильно
-
Не работает в браузерах и песочницах (например, Colab)
Сравнение с аналогами
Библиотека | Язык | Захват клавиш | Поддержка хоткеев | Запись макросов |
---|---|---|---|---|
keyboard | Python | Да | Да | Да |
pynput | Python | Да | Частично | Нет |
AutoHotKey | Собственный | Да | Да | Да |
Основные функции библиотеки keyboard
1. Эмуляция нажатий клавиш
-
keyboard.write(text)
Имитирует ввод текста с клавиатуры.keyboard.write("Hello, World!") # Печатает "Hello, World!"
-
keyboard.press(key)
Нажимает указанную клавишу (но не отпускает).keyboard.press("ctrl") # Нажимает Ctrl
-
keyboard.release(key)
Отпускает указанную клавишу.keyboard.release("ctrl") # Отпускает Ctrl
-
keyboard.press_and_release(key)
Нажимает и сразу отпускает клавишу (аналогkeyboard.send
).keyboard.press_and_release("enter") # Нажимает и отпускает Enter
-
keyboard.send(key, do_press=True, do_release=True)
Аналогичнаpress_and_release
, но позволяет управлять этапами нажатия.keyboard.send("alt+F4") # Нажимает Alt+F4
2. Горячие клавиши и комбинации
-
keyboard.add_hotkey(hotkey, callback, args=(), suppress=False, timeout=1, trigger_on_release=False)
Регистрирует функцию, которая вызывается при нажатии комбинации клавиш.def say_hello(): print("Hello!") keyboard.add_hotkey("ctrl+shift+a", say_hello) # При нажатии Ctrl+Shift+A вызовется say_hello()
-
keyboard.remove_hotkey(hotkey)
Удаляет ранее зарегистрированную горячую клавишу.hotkey = keyboard.add_hotkey("ctrl+space", lambda: print("Hotkey!")) keyboard.remove_hotkey(hotkey) # Удаляет обработчик
-
keyboard.clear_hotkeys()
Удаляет все зарегистрированные горячие клавиши.
3. Ожидание нажатия клавиш
-
keyboard.wait(key=None)
Останавливает выполнение программы до нажатия указанной клавиши.keyboard.wait("esc") # Ждёт нажатия Esc
-
keyboard.read_key()
Возвращает нажатую клавишу (блокирует выполнение, пока клавиша не будет нажата).key = keyboard.read_key() # Ждёт нажатия любой клавиши и возвращает её print(f"You pressed: {key}")
-
keyboard.read_event(suppress=False)
Возвращает объект события клавиатуры (KeyboardEvent
).event = keyboard.read_event() # Получает событие (нажатие/отпускание) print(event.name, event.event_type)
-
keyboard.read_hotkey()
Ждёт, пока пользователь введёт комбинацию клавиш, и возвращает её.hotkey = keyboard.read_hotkey() # Ждёт ввода комбинации (например, "ctrl+alt+del") print(f"Hotkey pressed: {hotkey}")
4. Запись и воспроизведение событий
-
keyboard.record(until="esc")
Записывает все нажатия клавиш до нажатия указанной клавиши.recorded = keyboard.record(until="esc") # Записывает все клавиши до Esc print(recorded) # Список событий KeyboardEvent
-
keyboard.play(events, speed_factor=1.0)
Воспроизводит записанные события клавиатуры.events = keyboard.record(until="esc") keyboard.play(events) # Воспроизводит записанные нажатия
5. Проверка состояния клавиатуры
-
keyboard.is_pressed(key)
Проверяет, нажата ли указанная клавиша в данный момент.if keyboard.is_pressed("shift"): print("Shift is pressed!")
-
keyboard.get_hotkey_name()
Возвращает строку с названием последней нажатой комбинации.keyboard.wait() # Ждём нажатия print(keyboard.get_hotkey_name()) # Выводит, например, "ctrl+alt+delete"
6. Блокировка и управление вводом
-
keyboard.block_key(key)
Блокирует указанную клавишу (игнорирует её нажатия).keyboard.block_key("a") # Теперь клавиша "a" не будет работать
-
keyboard.unblock_key(key)
Разблокирует клавишу.keyboard.unblock_key("a") # Возвращает работу клавиши "a"
-
keyboard.suppress_key(key)
Подавляет нажатие клавиши (не блокирует, но предотвращает её действие в системе).keyboard.suppress_key("win") # Отключает действие клавиши Win
7. Дополнительные функции
-
keyboard.hook(callback)
Устанавливает глобальный обработчик всех событий клавиатуры.def on_key_event(event): print(f"Key {event.name} was {event.event_type}") keyboard.hook(on_key_event) # Вызывает функцию при любом нажатии keyboard.wait("esc") # Ожидаем Esc для выхода
-
keyboard.on_press(callback)
Упрощённый хук только для нажатий клавиш.def on_press(key): print(f"Pressed: {key.name}") keyboard.on_press(on_press) keyboard.wait("esc")
-
keyboard.on_release(callback)
Упрощённый хук только для отпусканий клавиш.def on_release(key): print(f"Released: {key.name}") keyboard.on_release(on_release) keyboard.wait("esc")
-
keyboard.unhook_all()
Удаляет все установленные хуки.
Заключение
keyboard
— это одна из самых мощных библиотек для управления клавиатурой на Python. Её простота, гибкость и огромный набор функций позволяют использовать её в самых разных сферах — от автоматизации и тестирования до создания собственных утилит и интерфейсов.