Использование 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. Используется для отладки.

Библиотека keyboard в Python (работа с клавиатурой) - comments

En
библиотеке keyboard python (python)