Mit einem guten, leichtgewichtigen Modul Knickse könnten Sie so etwas machen (aus ihrem Beispielverzeichnis):
from curtsies import Input
def main():
with Input(keynames='curses') as input_generator:
for e in input_generator:
print(repr(e))
if __name__ == '__main__':
main()
Wenn Sie also Tasten auf Ihrer Tastatur drücken, erhalten Sie Folgendes:
'a'
's'
'KEY_F(1)'
'KEY_F(2)'
'KEY_F(3)'
'KEY_F(4)'
'KEY_F(5)'
'KEY_LEFT'
'KEY_DOWN'
'KEY_UP'
'KEY_RIGHT'
'KEY_NPAGE'
'\n'
Knickse werden von bpython als Abstraktion auf niedriger Ebene von Terminal-bezogenen Dingen verwendet.
Das grundlegende Problem beim Decodieren der Eingabe besteht in verschiedenen Terminals und Terminalemulatorprogrammen wie xterm
oder gnome-terminals
Physikalisch gleiche Tasten erzeugen unterschiedliche Tastencodesequenzen. Aus diesem Grund muss man wissen, welche Terminaleinstellungen zum Decodieren von Eingaben verwendet werden sollen. Ein solches Modul hilft, von diesen blutigen Details zu abstrahieren.
Dies ist eine einfache Schleife, die stdin in den Raw-Modus versetzt (Pufferung wird deaktiviert, sodass Sie nicht die Eingabetaste drücken müssen), um einzelne Zeichen zu erhalten. Sie sollten etwas Klügeres tun (wie eine with
Anweisung zum Deaktivieren), aber Sie bekommen die Idee hier:
import tty
import sys
import termios
orig_settings = termios.tcgetattr(sys.stdin)
tty.setcbreak(sys.stdin)
x = 0
while x != chr(27): # ESC
x=sys.stdin.read(1)[0]
print("You pressed", x)
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, orig_settings)
Ich denke, Sie müssten eine Schleife durchlaufen, um Schlüsselfreigaben in Python zu erkennen.
ETA noch eine Erklärung:
Unter Linux wird die Eingabe in Ihr Programm zeilengepuffert . Dies bedeutet, dass das Betriebssystem die Eingabe puffert, bis sie eine ganze Zeile enthält, sodass Ihr Programm nicht einmal die Eingabe des Benutzers sieht, bis der Benutzer auch die Eingabetaste drückt. Mit anderen Worten, wenn Ihr Programm erwartet, dass der Benutzer „w“ eingibt 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 übergeben, sodass Sie die Zeichenfolge "w\n" als Benutzereingabe erhalten.
Sie können dies deaktivieren, indem Sie tty in den Raw-Modus versetzen . Das machst du mit der Python-Funktion tty.setcbreak
Dadurch wird der tty-Treiber in Linux aufgerufen, um ihm mitzuteilen, dass er die Pufferung beenden soll. Ich habe die sys.stdin
bestanden Argument, um ihm mitzuteilen, für welchen Stream ich die Pufferung ausschalten wollte. Also nach dem tty.setcbreak
aufrufen, gibt Ihnen die obige Schleife eine Ausgabe für jede Taste, die der Benutzer drückt.
Eine Komplikation ist jedoch, dass sich tty nach dem Beenden Ihres Programms immer noch im Rohmodus befindet. Sie werden dies im Allgemeinen als unbefriedigend empfinden, da Sie nicht die Leistung erhalten, die moderne Terminaleinstellungen bieten (z. B. wenn Sie Steuer- oder Escape-Sequenzen verwenden). Beachten Sie beispielsweise, dass Sie möglicherweise Probleme haben, das Programm mit ctrl-C
zu beenden . Daher sollten Sie das Terminal wieder in den Cooked Mode versetzen sobald Sie mit dem Lesen der eingegebenen Zeichen fertig sind. Die termios.tcsetattr
Anruf sagt einfach "Stell das Terminal wieder so hin, wie ich es vorgefunden habe". Es weiß, wie das geht, indem es zuerst termios.tcgetattr
aufruft am Anfang des Programms, das sagt "Sagen Sie mir alle aktuellen Einstellungen für das Terminal".
Sobald Sie das alles verstanden haben, sollten Sie in der Lage sein, die Funktionalität in einer Funktion zu kapseln, die zu Ihrem Programm passt.
stdin
ist der Stream, den Sie vom Benutzer erhalten. Wikipedia kann Ihnen mehr über Standard-Streams erzählen.