Wie erstelle ich ein Menü, bei dem der Benutzer nicht die Eingabetaste drücken muss, um eine Auswahl zu treffen?

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

  •  08-06-2019
  •  | 
  •  

Frage

Ich habe ein Menü in Python.Dieser Teil war einfach.Ich benutze raw_input() um die Auswahl vom Benutzer zu erhalten.

Das Problem ist, dass raw_input (und Eingabe) erfordern, dass der Benutzer drückt Eingeben nachdem sie eine Auswahl getroffen haben.Gibt es eine Möglichkeit, das Programm sofort auf einen Tastendruck reagieren zu lassen?Folgendes habe ich bisher:

import sys
print """Menu
1) Say Foo
2) Say Bar"""
answer = raw_input("Make a selection> ")

if "1" in answer: print "foo"
elif "2" in answer: print "bar"

Es wäre toll, so etwas zu haben

print menu
while lastKey = "":
    lastKey = check_for_recent_keystrokes()
if "1" in lastKey: #do stuff...
War es hilfreich?

Lösung

Unter Windows:

import msvcrt
answer=msvcrt.getch()

Andere Tipps

Unter Linux:

  • Stellen Sie den Raw-Modus ein
  • Wählen Sie den Tastendruck aus und lesen Sie ihn
  • normale Einstellungen wiederherstellen
import sys
import select
import termios
import tty

def getkey():
    old_settings = termios.tcgetattr(sys.stdin)
    tty.setraw(sys.stdin.fileno())
    select.select([sys.stdin], [], [], 0)
    answer = sys.stdin.read(1)
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)
    return answer

print """Menu
1) Say Foo
2) Say Bar"""

answer=getkey()

if "1" in answer: print "foo"
elif "2" in answer: print "bar"

Wow, das hat ewig gedauert.Ok, hier ist, was ich herausgefunden habe

#!C:\python25\python.exe
import msvcrt
print """Menu
1) Say Foo 
2) Say Bar"""
while 1:
    char = msvcrt.getch()
    if char == chr(27): #escape
        break
    if char == "1":
        print "foo"
        break
    if char == "2":
        print "Bar"
        break

Die Verwendung von IDLE, dem Python-Ding, das mit Python geliefert wird, schlägt schwer fehl.Aber als ich es einmal unter DOS (äh CMD.exe) als echtes Programm ausprobiert habe, lief es einwandfrei.

Niemand versucht es im Leerlauf, es sei denn, Sie haben den Task-Manager zur Hand.

Ich habe bereits vergessen, wie ich mit Menüs gelebt habe, die nicht superschnell reagieren.

Der Grund, warum msvcrt in IDLE fehlschlägt, liegt darin, dass IDLE nicht auf die Bibliothek zugreift, die msvcrt ausführt.Wenn Sie das Programm hingegen nativ in cmd.exe ausführen, funktioniert es gut.Aus dem gleichen Grund, aus dem Ihr Programm auf Mac- und Linux-Terminals explodiert.

Aber ich denke, wenn Sie dies speziell für Windows verwenden, haben Sie mehr Leistung.

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