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?
Antworten:
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/eventX
Gerät, und es gibt auch Aggregate (die z. B./dev/input/mice
die Bewegung aller Mäuse im System darstellen). Ihr System kann auch/dev/input/by-path
und haben/dev/input/by-id
.Es gibt einen
ioctl
Aufruf,EVIOCGNAME
der 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.h
genau 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.
quelle
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
setxkbmap
Annahme eines Gerätearguments.Wenn Sie den Raw-Input-Ansatz verwenden, findet der lsinput Ihr Raw-Gerät für Sie.
quelle