Як відрізнити введення даних від різних клавіатур?


14

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

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

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

Отже, головне питання: як я можу перезавантажити клавіші певної клавіатури на інші клавіші. Я думав про використання F-клавіш, які не використовуватиму для інших цілей; або просто деякі символи, яких немає на жодній клавіатурі (припустимо, що такі є).

Чи можливо це в Linux / Unix? А якщо так, то як це зробити?


Як відбувається приєднання клавіатури? Ви можете прочитати прямо з пристрою. Це найочевидніший спосіб для мене, хоча, мабуть, є якийсь кращий спосіб.
TNW

Я додав, що вони підключаться через USB. Як я можу читати безпосередньо з пристрою за допомогою Python?
Стівен Руз

Схоже, що не прийнята відповідь набагато простіше, ніж прийнята.
Nikana Reklawyks

Відповіді:


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 знайде ваш необроблений пристрій для вас.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.