Wie erstelle ich ein Menü, bei dem der Benutzer nicht die Eingabetaste drücken muss, um eine Auswahl zu treffen?
-
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...
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.