Wie kann man Eingaben von verschiedenen Tastaturen unterscheiden?

14

Ich möchte eine Anwendung in Python schreiben, die Sie mit Ihrer Standardtastatur verwenden können, und eine speziell für die Anwendung entwickelte. Ich entwerfe es einfach, indem ich eine kleine numerische Tastatur mit Aufklebern benutze, um den verschiedenen Tasten Aktionen zuzuweisen. Beide Tastaturen werden per USB angeschlossen.

Wenn diese Tasten gedrückt werden, werden nur die regulären Signale (Zahlen, Operatoren und Eingaben) an Python gesendet, und es kann nicht zwischen den Signalen der Haupttastatur und der Sondertastatur unterschieden werden.

Da Python (soweit ich das beurteilen konnte) keine Methode hat, um diese Unterscheidung zu treffen, möchte ich dies auf dem Betriebssystem selbst tun. Ich werde es für den Raspberry Pi programmieren, also wird es Linux sein.

Die Hauptfrage lautet also: Wie kann ich die Tasten einer bestimmten Tastatur anderen Tastencodes zuordnen? Ich habe darüber nachgedacht, die F-Tasten zu verwenden, die ich nicht für andere Zwecke verwende. oder nur einige Zeichen, die auf keiner Tastatur vorhanden sind (sofern solche vorhanden sind).

Ist das unter Linux / Unix möglich? Und wenn ja, wie kann ich das machen?

Steven Roose
quelle
Wie wird die Tastatur angeschlossen? Möglicherweise möchten Sie direkt vom Gerät lesen. Das ist für mich der naheliegendste Weg, obwohl es wohl einen besseren gibt.
TNW
Ich fügte hinzu, dass sie per USB verbinden werden. Wie kann ich mit Python direkt vom Gerät lesen?
Steven Roose
Es sieht so aus, als ob die nicht akzeptierte Antwort viel einfacher ist als die akzeptierte.
Nikana Reklawyks

Antworten:

12

Wenn Sie Linux verwenden, können Sie Eingabegeräte am besten über die Linux-Ereignisschnittstelle unterscheiden . Nachdem die hardwarespezifische Eingabe eines Geräts dekodiert wurde, wird sie in eine Linux-spezifische Ereigniszwischenstruktur konvertiert und durch Lesen eines oder mehrerer der Zeichengeräte unter verfügbar gemacht/dev/input/ . Dies ist übrigens völlig unabhängig von der von Ihnen verwendeten Programmiersprache.

Jedes Hardwaregerät erhält ein eigenes /dev/input/eventXGerät, und es gibt auch Aggregate (die z. B. /dev/input/micedie Bewegung aller Mäuse im System darstellen). Ihr System kann auch /dev/input/by-pathund haben/dev/input/by-id .

Es gibt einen ioctlAufruf, EVIOCGNAMEder den Namen des Geräts als lesbare Zeichenfolge zurückgibt, oder Sie können so etwas verwenden /dev/input/by-id/usb-Logitech_USB_Gaming_Mouse-mouse.

Sie öffnen das Gerät und jedes Mal, wenn ein Ereignis von der Eingabehardware eintrifft, erhalten Sie ein Datenpaket. Wenn Sie C lesen können, können Sie die Datei studieren, die /usr/include/linux/input.hgenau zeigt, wie dieses Zeug funktioniert. Wenn Sie dies nicht tun, können Sie diese Frage lesen, die alle Informationen enthält, die Sie benötigen.

Die gute Sache über das Event - Schnittstelle ist , dass Sie herausfinden , welches Gerät Sie benötigen und Sie können Informationen von dieser Eingabegerät lesen nur , alle anderen zu ignorieren. Sie erhalten auch Benachrichtigungen über Tasten, Knöpfe und Bedienelemente, die Sie normalerweise nicht erhalten würden, wenn Sie nur den 'gekochten' Zeichenstrom von einem Terminal lesen: Sogar tote Tasten wieShift usw.

Das Schlimme ist, dass die Ereignisschnittstelle keine gekochten Zeichen zurückgibt , sondern nur numerische Codes für Schlüssel verwendet (die Codes für jeden Schlüssel befinden sich in der oben genannten Header-Datei - aber auch in der Python-Quelle von event.py . Wenn Ihr Eingabegerät ungewöhnliche Tasten hat, müssen Sie möglicherweise ein wenig experimentieren, bis Sie die richtigen Zahlen erhalten.

Alexios
quelle
2

Ein alternativer Ansatz (wenn Ihre "Tastatur" nicht viele Tasten hat - viele Geräte geben vor, Tastaturen zu sein) besteht darin, auf jede Tastatur speziell eine Tastenzuordnung anzuwenden und sicherzustellen, dass die Tasten unterschieden werden.

Dies wird hier beschrieben: /superuser/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-only . Der Hauptpunkt ist die setxkbmapAnnahme eines Gerätearguments.

Wenn Sie den Raw-Input-Ansatz verwenden, findet der lsinput Ihr Raw-Gerät für Sie.

Att Righ
quelle