Как отличить ввод от разных клавиатур?

14

Я хочу написать приложение на Python, которое вы можете использовать с клавиатурой по умолчанию и специально разработанное для этого приложения. Я разработаю его, просто используя небольшую цифровую клавиатуру с наклейками, чтобы назначать действия различным клавишам. Обе клавиатуры будут подключены через USB.

Однако, когда эти клавиши нажаты, только их обычные сигналы (номера, операторы и вводы) будут отправлены на Python, и он не сможет различить сигналы от основной клавиатуры и специальной клавиатуры.

Поскольку у Python (насколько я мог найти) нет способа сделать это различие, я хочу сделать это на самой ОС. Я буду программировать его для Raspberry Pi, так что это будет Linux.

Итак, главный вопрос: как мне переназначить клавиши определенной клавиатуры на другие коды клавиш. Я думал об использовании F-клавиш, которые я не буду использовать для других целей; или просто некоторые символы, которых нет ни на одной клавиатуре (предположим, что они есть).

Возможно ли это в Linux / Unix? И если так, как я могу это сделать?

Стивен Руз
источник
Как будет прикреплена клавиатура? Вы можете читать прямо с устройства. Это самый очевидный способ для меня, хотя, полагаю, есть и лучший способ.
TNW
Я добавил, что они будут подключаться по USB. Как я могу читать прямо с устройства, используя Python?
Стивен Руз
Похоже, что не принятый ответ намного проще, чем принятый.
Никана Рекламикс

Ответы:

12

Если вы используете Linux, лучший способ различить устройства ввода - это использовать интерфейс событий Linux . После того, как аппаратный ввод устройства декодируется, он преобразуется в промежуточную специфичную для Linux структуру событий и становится доступной, читая одно или несколько символьных устройств в разделе /dev/input/. Кстати, это совершенно не зависит от языка программирования, который вы используете.

Каждое аппаратное устройство получает свое собственное /dev/input/eventXустройство, и есть также агрегаты (например, /dev/input/miceкоторые представляют движение всех мышей в системе). Ваша система также может иметь /dev/input/by-pathи /dev/input/by-id.

Есть ioctlвызываемый, EVIOCGNAMEкоторый возвращает имя устройства в виде удобочитаемой строки, или вы можете использовать что-то подобное /dev/input/by-id/usb-Logitech_USB_Gaming_Mouse-mouse.

Вы открываете устройство, и каждый раз, когда поступает событие от устройства ввода, вы получаете пакет данных. Если вы можете читать C, вы можете изучить файл, /usr/include/linux/input.hкоторый показывает, как именно это работает. Если вы этого не сделаете, вы можете прочитать этот вопрос, который предоставляет всю необходимую информацию.

Преимущество интерфейса событий заключается в том, что вы просто узнаете, какое устройство вам нужно, и можете читать входные данные только с этого устройства ввода , игнорируя все остальные. Вы также будете получать уведомления о клавишах, кнопках и элементах управления, которые вы обычно не получаете, просто читая «обработанный» поток символов из терминала: даже мертвые клавиши, как Shift, и т. Д.

Плохо то, что интерфейс событий не возвращает «приготовленные» символы, он просто использует числовые коды для ключей (коды, соответствующие каждому ключу, находятся в вышеупомянутом заголовочном файле - но также в Python-источнике event.py . Если ваше устройство ввода имеет необычные клавиши / кнопки, вам может потребоваться немного поэкспериментировать, пока вы не получите правильные цифры.

Алексиос
источник
2

Альтернативный подход (если ваша «клавиатура» не имеет много клавиш - многие устройства претендуют на то, чтобы быть клавиатурами) - это применить сопоставление клавиш для каждой клавиатуры специально и убедиться, что клавиши различаются.

Это изложено здесь: /superuser/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-only . Основным моментом является setxkbmapаргумент устройства.

Если вы используете подход необработанного ввода, lsinput найдет ваше необработанное устройство для вас.

Att Righ
источник