Использование keyboard в Python
Библиотека keyboard в Python: управление клавиатурой
Основное эффективное решение: библиотека keyboard для глобального перехвата и эмуляции клавиш
Библиотека keyboard позволяет перехватывать нажатия клавиш, создавать горячие клавиши, эмулировать ввод и записывать последовательности. Она работает на Windows, Linux и macOS (с правами администратора). Установка: pip install keyboard.
import keyboard
# Ожидание определенной клавиши
keyboard.wait('esc')
print('Нажата клавиша ESC')
библиотеке keyboard python (библиотека keyboard в python (работа с клавиатурой))
Пример демонстрирует ожидание нажатия клавиши esc. Программа блокируется до нажатия.
Как сделать горячую клавишу для вызова функции?
import keyboard
def on_trigger():
print('Горячая клавиша нажата')
# Регистрация комбинации
keyboard.add_hotkey('ctrl+shift+a', on_trigger)
print('Ожидание ctrl+shift+a')
keyboard.wait() # Бесконечное ожидание
Функция add_hotkey регистрирует комбинацию и вызывает callback при её нажатии. Комбинации поддерживают модификаторы: ctrl, alt, shift, win.
Типичная ошибка:
На Linux и macOS для глобального перехвата требуются права root. Если код не работает, запустите с sudo. Ошибка PermissionError указывает на недостаток прав.
Решение: sudo python script.py (Linux/macOS).
Как записать и воспроизвести последовательность нажатий?
import keyboard
# Запись до нажатия 'esc'
print('Запись начата. Нажмите ESC для остановки.')
recorded = keyboard.record(until='esc')
print('Запись завершена.')
# Воспроизведение
print('Воспроизведение...')
keyboard.play(recorded, speed_factor=1.0)
record сохраняет все события (нажатие/отпускание) в список. play воспроизводит их с заданной скоростью. Полезно для создания макросов.
Проблема:
При воспроизведении может возникнуть зацикливание, если в запись попала клавиша остановки. Лучше записывать отдельным файлом и проверять.
Как выполнить действие при нажатии определенной клавиши?
import keyboard
def on_key(event):
if event.name == 'space':
print('Пробел нажат')
elif event.name == 'a':
print('Клавиша A нажата')
keyboard.on_press(on_key)
keyboard.wait('esc')
on_press принимает функцию с одним аргументом - объект события (свойства: name, event_type, scan_code, time).
Типичная ошибка:
Если в callback выполнять длительные операции, программа может пропускать нажатия. Для асинхронности используйте отдельный поток.
Как эмулировать нажатие клавиши?
import keyboard
# Нажать и отпустить 'a'
keyboard.press_and_release('a')
# Нажать 'ctrl', написать 'c', отпустить
keyboard.press('ctrl')
keyboard.write('c')
keyboard.release('ctrl')
press_and_release имитирует полное нажатие. write печатает строку (эмулирует набор).
Проблема:
На некоторых системах (особенно в терминалах) эмуляция может не работать корректно из-за прав доступа или контекста ввода. Проверяйте на целевом ПО.
Как временно заблокировать клавиатуру?
import keyboard
# Заблокировать все клавиши
keyboard.block_key('a')
# Разблокировать
keyboard.unblock_key('a')
# Заблокировать все клавиши, кроме 'esc'
for key in range(256):
keyboard.block_key(key)
keyboard.unblock_key('esc')
Блокировка работает для отдельных клавиш. Для полной блокировки удобно перебирать коды клавиш (0-255). Отпускание через unblock.
Ошибка:
Если заблокировать все клавиши, включая 'esc', выход невозможен. Всегда оставляйте аварийную клавишу.
Цели и случаи использования
- Горячие клавиши для автоматизации повседневных задач (запуск скриптов, смена раскладки).
- Макросы для игр или офисных программ (запись последовательности).
- Системы родительского контроля (блокировка клавиш).
- Эмуляция ввода для тестирования пользовательского интерфейса.
Расширенные примеры использования библиотеки keyboard
Ниже приведены более сложные сценарии с пояснениями и выводом.
Пример 1: макрос с задержками (автоматизация ввода)
import keyboard
import time
def macro_hello():
keyboard.write('Привет, мир!')
time.sleep(0.5)
keyboard.press_and_release('enter')
def macro_quit():
print('Выход')
exit()
keyboard.add_hotkey('ctrl+1', macro_hello)
keyboard.add_hotkey('ctrl+esc', macro_quit)
print('Макросы активны. Нажмите ctrl+1 для ввода, ctrl+esc для выхода.')
keyboard.wait()
Результат: при нажатии ctrl+1 в активном окне появится строка 'Привет, мир!' и эмуляция Enter.
Пример 2: запись макроса с сохранением в файл и воспроизведение
import keyboard
import pickle
print('Нажмите F2 для начала записи, F3 для остановки, F4 для воспроизведения.')
recording = False
recorded_events = []
def start_recording():
global recording, recorded_events
print('Запись начата')
recording = True
recorded_events.clear()
keyboard.hook(lambda e: recorded_events.append(e) if recording else None)
def stop_recording():
global recording
print('Запись остановлена')
recording = False
keyboard.unhook_all()
with open('macro.pkl', 'wb') as f:
pickle.dump(recorded_events, f)
def play_recording():
try:
with open('macro.pkl', 'rb') as f:
events = pickle.load(f)
keyboard.play(events, speed_factor=1.0)
print('Воспроизведено')
except FileNotFoundError:
print('Сначала запишите макрос.')
keyboard.add_hotkey('F2', start_recording)
keyboard.add_hotkey('F3', stop_recording)
keyboard.add_hotkey('F4', play_recording)
keyboard.wait('esc')
Результат: последовательность нажатий (включая задержки между событиями) сохраняется в файл macro.pkl. Затем её можно воспроизвести нажатием F4.
Пример 3: обработка комбинаций с условием (игровой макрос)
import keyboard
import random
def roll_dice():
result = random.randint(1,6)
keyboard.write(str(result))
print(f'Выпало: {result}')
# Запуск по двойному нажатию 'r'
keyboard.add_hotkey('r', roll_dice, timeout=0.3) # таймаут между нажатиями 0.3с
print('Для броска кубика быстро дважды нажмите r. ESC для выхода.')
keyboard.wait('esc')
Результат: при двойном быстром нажатии r в поле ввода появится случайное число от 1 до 6.
Пример 4: работа с раскладкой клавиатуры (определение локали)
import keyboard
def on_key_event(event):
# event.scan_code может отличаться в зависимости от раскладки
if event.name == 'a':
print('Нажата A, scan_code:', event.scan_code)
# Для получения символа с учетом раскладки нужна дополнительная обработка
keyboard.on_press(on_key_event)
keyboard.wait('esc')
Примечание: библиотека keyboard не поддерживает напрямую определение текущей раскладки. Для этого используется модуль ctypes или системные вызовы. Сканирующий код клавиши фиксирован, но имя зависит от системной интерпретации.
Пример 5: блокировка всех клавиш, кроме разрешенных (киоск-режим)
import keyboard
# Разрешить только цифры и backspace для ввода кода
allowed_keys = ['0','1','2','3','4','5','6','7','8','9','backspace']
def block_others(e):
if e.event_type == 'down' and e.name not in allowed_keys:
return False # блокировка события (не передавать дальше)
keyboard.hook(block_others, suppress=True) # подавление оригинального нажатия
print('Разрешены только цифры и backspace. ESC для выхода.')
keyboard.wait('esc')
Результат: любые клавиши, кроме цифр и backspace, игнорируются системой. Флаг suppress предотвращает дальнейшее распространение события.
Пример 6: эмуляция комбинации ctrl+alt+del (Windows)
import keyboard
import os
# На Windows комбинация ctrl+alt+del обрабатывается системой и не может быть эмулирована напрямую.
# Используется альтернативный способ: вызов функции LockWorkStation.
if os.name == 'nt':
import ctypes
ctypes.windll.user32.LockWorkStation()
else:
print('Не поддерживается')
Пояснение: библиотека keyboard не может эмулировать защищенные комбинации Windows. Для них применяются системные вызовы.
Пример 7: чтение состояния клавиши (зажата ли клавиша в данный момент)
import keyboard
import time
while True:
if keyboard.is_pressed('shift'):
print('Shift зажат')
time.sleep(0.1)
if keyboard.is_pressed('esc'):
break
Результат: пока удерживается Shift, каждые 0.1 сек выводится сообщение. is_pressed возвращает True/False.
Пример 8: отлов нажатий в фоновом режиме и запись в лог
import keyboard
import logging
logging.basicConfig(filename='keylog.txt', level=logging.INFO, format='%(asctime)s - %(message)s')
def log_event(e):
logging.info(f'{e.event_type} - {e.name}')
keyboard.on_press(log_event)
keyboard.on_release(log_event)
print('Логирование начато. ESC для выхода.')
keyboard.wait('esc')
Файл keylog.txt будет содержать записи вида: 2025-03-21 12:00:00,123 - down - a. Используется для отладки.