Comment créer un menu qui ne nécessite pas que l'utilisateur appuie sur [Entrée] pour effectuer une sélection ?
-
08-06-2019 - |
Question
J'ai un menu en Python.Cette partie était facile.j'utilise raw_input()
pour obtenir la sélection de l'utilisateur.
Le problème est que raw_input
(et saisie) nécessitent que l'utilisateur appuie sur Entrer après avoir fait une sélection.Existe-t-il un moyen de faire en sorte que le programme agisse immédiatement après une frappe ?Voici ce que j'ai jusqu'à présent :
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"
Ce serait génial d'avoir quelque chose comme
print menu
while lastKey = "":
lastKey = check_for_recent_keystrokes()
if "1" in lastKey: #do stuff...
La solution
Sous Windows :
import msvcrt
answer=msvcrt.getch()
Autres conseils
Sous Linux :
- définir le mode brut
- sélectionner et lire la frappe
- restaurer les paramètres normaux
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, ça a pris une éternité.Ok, voici ce avec quoi j'ai fini
#!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
Cela échoue durement en utilisant IDLE, le python... chose... fourni avec python.Mais une fois que je l'ai essayé sous DOS (euh, CMD.exe), en tant que vrai programme, tout a bien fonctionné.
Personne ne l'essaye dans IDLE, à moins que vous n'ayez le Gestionnaire des tâches à portée de main.
J'ai déjà oublié comment je vivais avec des menus qui ne réagissent pas très instantanément.
La raison pour laquelle msvcrt échoue dans IDLE est que IDLE n'accède pas à la bibliothèque qui exécute msvcrt.Alors que lorsque vous exécutez le programme de manière native dans cmd.exe, cela fonctionne bien.Pour la même raison que votre programme explose sur les terminaux Mac et Linux.
Mais je suppose que si vous comptez l'utiliser spécifiquement pour Windows, vous aurez plus de pouvoir.