GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ist der einfachste Weg, um Tastendrücke in Python 3 auf einem Linux-Rechner zu erkennen?

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.


Linux
  1. RDP Linux zu Windows:Der einfachste Weg 2019!

  2. Was ist das Linux-Äquivalent zur DOS-Pause?

  3. Was verwende ich unter Linux, um ein Python-Programm ausführbar zu machen?

  4. Vergleichen Sie zwei Bilder auf Python/Linux-Weise

  5. Was ist der richtige Weg, um einen Mongod-Dienst unter Linux / OS X zu starten?

So bearbeiten Sie PDF-Dateien unter Linux auf die einfachste Art und Weise

Was ist die Shell unter Linux?

Was ist der Kill-Befehl in Linux?

Was ist der einfachste Weg, um Speicherplatz auf einer Festplatte freizugeben?

Was ist die kolorierte Version des Linux-Top-Programms?

Was ist der einfachste Weg, Daten von stdout als Diagramm zu visualisieren?