Ist es möglich, Getch () zu verwenden, um Eingaben unterschiedlicher Länge zu erhalten?

StackOverflow https://stackoverflow.com/questions/7310958

  •  26-10-2019
  •  | 
  •  

Frage

Ich habe das Abenteuer aufgenommen, ein relativ kleines Rollenspiel für Befehlszeilen zu erstellen, um meine neu entdeckten Python-Muskeln zu beugen, aber ich bin bereits auf ein Rätsel gestoßen. Ich verwende diese Implementierung von getCh ():

def getch():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    tty.setraw(sys.stdin.fileno())
    key = sys.stdin.read(3)
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)

Ich habe key Setzen Sie in 3 Zeichen, um Pfeiltasten zu erfassen. Zum Beispiel wird in As gelesen ESC[A; Mit dieser Methode kann ich verwenden key[2] um festzustellen, ob eine Pfeiltaste gedrückt wurde und welche. Alles gut und gut, außer dass ich auch alle möglichen anderen Schlüssel erfassen möchte; q Für Quest -Log, wasd Für die Bewegung (drücken Sie die Pfeile in verschiedenen Ordnungen die Angriffsmethode) und viele andere. Das Problem ist sofort klar; wenn getch() Gibt nur ein einzelnes Zeichen zurück, die Pfeilfunktionen sind vollständig verloren.

Ich denke darüber nach, das Pfeilsystem insgesamt zu überdenken, wenn es keine einfache Lösung gibt, aber ich bin mir fast sicher, dass es geben muss. Zugegeben, ich weiß wenig von dem, was in sich vorgeht tty, Aber ich habe irgendwo gelesen, dass die überschüssigen Zeichen einer Pfeilpresse im Puffer erhalten bleiben, wenn Sie nur in 1 Charakter lesen. Wie könnte ich auf diesen Puffer zugreifen? Alternativ gibt es eine clevere Möglichkeit, es zu sagen stdin Erwartung der Eingabe von variabler Länge?

Vielen Dank im Voraus für alle Hilfe.

War es hilfreich?

Lösung

Lesen Sie nicht drei Zeichen. Lesen Sie einen.

Wenn der eine Charakter, den Sie gerade lesen, ist ESC, Lesen Sie ein oder zwei weitere Charaktere, um zu sehen, ob es sich um einen Pfeilschlüssel oder was auch immer handelt. Wenn es ein war q, Mach das Ding dafür und fange dann von vorne an.

Andere Tipps

Wenn Sie in Betracht ziehen, ein komplettes Spiel zu entwickeln, PyGame könnte auch (schließlich nützlich sein ncurses).

Das getch() Snippet kann aufgerüstet werden, um den Pfeilschlüssel zu lesen, aber wie man den Unterschied zwischen dem ersten Zeichen eines Pfeilschlüssels und der ESC Schlüssel? Wenn der Benutzer drückt ESC, Die beschriebene Lösung wird wahrscheinlich auf die nächste Taste warten.

Ich habe keine Lösung für den Umgang mit diesem letzten Fall gefunden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top