Was ist der einfachste Weg, um Tastenbetätigungen in Python 3 auf einem Linux-Rechner zu erkennen?

8

Im Moment versuche ich einen kleinen Code mit einem Raspberry Pi und einem Makey Makey zu machen. Das Makey Makey ist ein kleines Board, das als USB-Tastatur fungiert, wenn bestimmte Kontakte mit Strom versorgt werden. Meine Frage ist, was ist der einfachste Weg, diese Tastenkombinationen in einem Python-Skript zu erkennen. Ich verstehe, dass die Verwendung der GPIO-Pins einfacher wäre, aber im Moment suche ich danach. Ich habe Beispiele gesehen, wie die Verwendung von getch () von msvcrt (was ich verstehe, ist nur Windows) mit pygame.key und getKey verwenden. Welche These ist am einfachsten zu benutzen? Gibt es welche, die eine Taste drücken und eine Taste loslassen können?

Pseudocode-Code (... ist das, wie es heißt?)

%Vor%

und so weiter. Danke.

    
montainz09 28.12.2015, 16:43
quelle

2 Antworten

9

Dies ist eine einfache Schleife, die stdin in den Raw-Modus versetzt (Deaktivieren der Pufferung, so dass Sie nicht die Eingabetaste drücken müssen), um einzelne Zeichen zu erhalten. Sie sollten etwas schlauer machen (wie eine with Anweisung, um es zu deaktivieren), aber Sie bekommen die Idee hier:

%Vor%

Ich denke, Sie müssten eine Schleife ausführen, um Schlüsselversionen in Python zu erkennen.

ETA noch eine Erklärung:

Unter Linux ist die Eingabe für Ihr Programm gepuffert . Dies bedeutet, dass das Betriebssystem die Eingabe puffert, bis es eine ganze Zeile hat, so dass Ihr Programm nicht einmal etwas sehen wird, das der Benutzer eingegeben hat, bis der Benutzer ebenfalls "Enter" drückt. Mit anderen Worten, wenn Ihr Programm erwartet, dass der Benutzer 'w' tippt und der Benutzer dies tut, wird 'w' im Puffer des Betriebssystems sitzen, bis der Benutzer 'enter' drückt. An diesem Punkt wird die gesamte Zeile an Ihr Programm geliefert, so dass Sie die Zeichenfolge "w \ n" als Benutzereingabe erhalten.

Sie können dies deaktivieren, indem Sie das tty im Rohmodus platzieren. Sie tun dies mit der Python-Funktion tty.setraw , die einen Aufruf des tty-Treibers in Linux ausführt, um ihn anzuweisen, die Pufferung zu stoppen. Ich habe ihm das Argument sys.stdin übergeben, um ihm mitzuteilen, welchen Stream ich für 1 ausschalten wollte. Nach dem Aufruf von tty.setraw gibt Ihnen die obige Schleife eine Ausgabe für jede Taste, die der Benutzer drückt.

Eine Komplikation ist jedoch, dass das tty nach dem Beenden des Programms immer noch im Raw-Modus ist. Sie werden dies im Allgemeinen als unbefriedigend empfinden, da Sie nicht die Leistung erhalten, die moderne Terminaleinstellungen bieten (wie wenn Sie Kontroll- oder Escape-Sequenzen verwenden). Beachten Sie beispielsweise, dass Sie Probleme beim Beenden des Programms mit ctrl-C haben könnten. Folglich sollten Sie das Terminal wieder in den gekochten Modus versetzen, sobald Sie alle Eingabezeichen gelesen haben. Der termios.tcsetattr -Aufruf sagt einfach "setze das Terminal zurück, wie ich es gefunden habe". Er weiß, wie dies zu tun ist, indem er am Anfang des Programms zuerst termios.tcgetattr aufruft, das heißt "Erzähle mir alle aktuellen Einstellungen für das Terminal".

Sobald Sie alles verstanden haben, sollten Sie die Funktionalität in einer Funktion, die zu Ihrem Programm passt, leicht kapseln können.

1 stdin ist der Stream, der Ihnen vom Benutzer eingegeben wird. Wikipedia kann Ihnen mehr über Standard-Streams erzählen.

    
Turn 28.12.2015, 17:06
quelle
10

Unter Verwendung eines guten leichtgewichtigen Moduls knicks könntest du so etwas machen (aus ihrem examples / directory):

%Vor%

Wenn Sie die Tasten auf Ihrer Tastatur drücken, erhalten Sie etwa Folgendes:

%Vor%

knicks wird von bpython als eine Abstraktion auf Terminalebene verwendet.

Das grundlegende Problem der Dekodierung der Eingabe ist, dass in verschiedenen Terminals und Terminal-Emulator-Programmen wie xterm oder gnome-terminals physikalisch dieselben Schlüssel unterschiedliche Schlüsselcodesequenzen erzeugen. Deshalb muss man wissen, welche Terminaleinstellungen zum Dekodieren der Eingabe verwendet werden sollten. Solch ein Modul hilft, von diesen blutigen Details zu abstrahieren.

    
user3159253 28.12.2015 16:58
quelle