다른 키보드와 입력을 구별하는 방법은 무엇입니까?


14

기본 키보드 및 응용 프로그램 용으로 특별히 설계된 키보드와 함께 사용할 수있는 Python으로 응용 프로그램을 작성하고 싶습니다. 스티커가 달린 작은 숫자 키보드를 사용하여 다른 키에 동작을 부여하여 간단히 디자인 할 것입니다. 두 키보드 모두 USB로 연결됩니다.

그러나이 키를 누르면 일반 신호 (숫자, 연산자 및 입력) 만 Python으로 전송되며 기본 키보드와 특수 키보드의 신호를 구별 할 수 없습니다.

파이썬은이 구별을 할 수있는 방법이 없기 때문에 OS 자체에서하고 싶습니다. Raspberry Pi 용으로 프로그래밍 할 예정이므로 Linux가됩니다.

따라서 주요 질문 : 특정 키보드의 키를 다른 키 코드로 다시 매핑하는 방법은 무엇입니까? 다른 용도로는 사용하지 않는 F 키를 사용하는 것에 대해 생각했습니다. 또는 키보드에없는 일부 문자 (있는 경우).

Linux / Unix에서 가능합니까? 그렇다면 어떻게해야합니까?


키보드는 어떻게 부착됩니까? 장치에서 바로 읽을 수 있습니다. 더 좋은 방법이 있다고 생각하지만 그것이 가장 분명한 방법입니다.
TNW

USB로 연결한다고 덧붙였습니다. 파이썬을 사용하여 장치에서 직접 읽을 수 있습니까?
Steven Roose

허용되지 않는 답변이 허용되는 것보다 훨씬 간단한 것처럼 보입니다.
Nikana Reklawyks

답변:


12

Linux를 사용하는 경우 입력 장치를 구별하는 가장 좋은 방법은 Linux Event Interface 를 사용하는 것 입니다. 장치의 하드웨어 특정 입력이 디코딩 된 후에는 중간 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은 원시 장치를 찾습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.