Was ist der einfachste Weg zu ermitteln Schlüssel-Maschinen in python 3 in einer linux-Maschine?
Recht jetzt ich versuche zu machen, einen kleinen code mit einem raspberry pi und makey makey. Der makey makey ist eine kleine platine, die wirkt wie eine usb-Tastatur, wenn Sie bestimmte Kontakte angetrieben werden. Meine Frage ist, was ist der einfachste Weg zu erkennen, diese Tastendrücke innerhalb eines python-Skript. Ich verstehe die Verwendung der GPIO-pins einfacher wäre, aber jetzt bin ich auf der Suche für diese. Ich habe schon Beispiele gesehen, wie die Verwendung von Verwendung von getch() aus msvcrt (das aus, was ich verstehe ist (nur windows) mithilfe von pygame.Schlüssel, und mit getKey. Welche von diesen ist am leichtesten zu bedienen? Gibt es für die Erkennung einer gedrückten Taste und eine Taste losgelassen?
Pseudocode Code (... ist es das was es genannt?)
import whatever needs importing
if the "W" key is pressed:
print ("You pressed W")
elif the "S" is pressed:
print ("You pressed S")
und so weiter. Danke.
- Sie könnten check-out-grafische Benutzeroberflächen mit key bindings siehe tk: docs.python.org/3/library/tk.html
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine einfache Schleife setzen, wird von stdin im raw-Modus (deaktivieren der Pufferung so dass Sie nicht haben, um drücken Sie die EINGABETASTE), um einzelne Zeichen. Sie tun etwas schlauer (wie ein
with
- Anweisung, um es zu deaktivieren), aber Sie bekommen die Idee hier:Ich denke, Sie würde haben, um eine Schleife zu erkennen-key-Versionen in Python.
ETA etwas mehr Erklärung:
Unter Linux, Eingang zu Ihrem Programm line-buffered. Dies bedeutet, dass das Betriebssystem gepuffert werden hochgezogen, bis Sie eine ganze Zeile, so dass Ihr Programm noch nicht einmal alles, was der Benutzer eingegeben werden, bis der Benutzer trifft auch auf "enter". In anderen Worten, wenn das Programm davon aus, dass der Benutzer zum eingeben von 'w' und der Benutzer dies tut, 'w' sitzen wird, in der OS-Puffer, bis der Benutzer trifft "enter". An diesem Punkt wird die gesamte Zeile geliefert zu Ihrem Programm, so erhalten Sie die Zeichenfolge "w\n" wie die Eingabe des Benutzers.
Können Sie deaktivieren, indem Sie die tty-in raw-Modus. Sie tun dieses mit der Python-Funktion
tty.setcbreak
die einen nennen, die das tty-Treiber in linux zu sagen, es um die Pufferung zu stoppen. Ich ging es diesys.stdin
argument zu sagen, es die Streams, die ich drehen wollte, Pufferung off für1. So, nachdem dietty.setcbreak
nennen, die Schlaufe oben wird Ihnen die Ausgabe für jede Taste der Nutzer drückt.Einer Komplikation, obwohl, ist, dass, sobald Ihr das Programm beendet, wird die tty-Schnittstelle ist noch im raw-Modus. Sie werden in der Regel finden diese unbefriedigend, da Sie nicht bekommen, jede von der Kraft, die moderne terminal-Einstellungen bieten (wie wenn man control-oder escape-Sequenzen). Zum Beispiel, beachten Sie, dass Sie möglicherweise Schwierigkeiten haben, beenden Sie das Programm mit
ctrl-C
. Daher sollten Sie das terminal wieder in gekocht-Modus wenn Sie fertig sind, Lesen die Zeichen. Dietermios.tcsetattr
rufen Sie einfach sagt "das terminal den Weg zurück, ich habe es gefunden". Sie weiß, wie Sie dies tun, indem Sie den ersten Aufruftermios.tcgetattr
am Anfang des Programms, das sagt: "sagen Sie mir alle aktuellen Einstellungen für den terminal".Sobald Sie verstehen, allen, dass, sollten Sie leicht in der Lage sein, die Kapselung der Funktionalität in einer Funktion, die passt zu Ihrem Programm.
1
stdin
ist der stream, die Eingabe von dem Benutzer. Wikipedia kann Ihnen sagen, mehr über standard-streams.print
Anweisungen innerhalb der Schleife waren nicht die Rückkehr zum Beginn der Zeile. In "gekocht" und "cbreak" - Modus\n
wird umgewandelt in\r\n
. Im "raw" - Modus, dass die Umstellung nicht passieren. Finden Sie diese Antwort für weitere Informationen: [stackoverflow.com/a/43929760/6117414]. TLDR; verwendencbreak
im Ortsetraw
.Mit einem guten leichten Modul curtsies Sie etwas tun könnte, wie dieser (aus Ihrer Beispiele/Verzeichnis):
Also drücken der Tasten auf Ihrer Tastatur haben Sie etwas wie dies:
curtsies wird von bpython als low-level-Abstraktion von terminal-related stuff.
Ist das grundlegende problem der Decodierung der input ist, dass in den verschiedenen terminals und terminal-emulator-Programme wie
xterm
odergnome-terminals
physisch gleichen Schlüssel erzeugen verschiedene Schlüsselcode-Sequenzen. Deshalb muss man wissen, welche terminal-Einstellungen sollten verwendet werden, zu entschlüsseln Eingang. Solch ein Modul hilft zu abstrahieren diese blutigen details.