Comment est-ce que je fais un menu qui n'exige pas que l'utilisateur appuie sur [enter] pour faire une sélection?

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 input) nécessite que l'utilisateur appuie sur Enter après avoir fait une sélection. Y at-il un moyen de faire agir le programme immédiatement après une frappe? Voici ce que j'ai jusqu'ici:

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...
0

4 Réponses

Wow, ça a pris une éternité. Ok, voici ce que j'ai fini avec

#!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

Il échoue dur en utilisant IDLE, le python ... chose ... qui vient avec python. Mais une fois que je l'ai essayé dans DOS (er, CMD.exe), comme un vrai programme, alors ça s'est bien passé.

Personne ne l'essaye dans IDLE, sauf si vous avez le Gestionnaire des tâches à portée de main.

J'ai déjà oublié comment j'ai vécu avec des menus qui ne sont pas super réactifs.

0
ajouté

Sur Linux:

  • définir le mode brut
  • sélectionnez et lisez la séquence de touches
  • 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"

0
ajouté

Sur Windows:

import msvcrt
answer=msvcrt.getch()
0
ajouté

La raison pour laquelle msvcrt échoue dans IDLE est que IDLE n'accède pas à la bibliothèque qui exécute msvcrt. Considérant que lorsque vous exécutez nativement le programme 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 allez l'utiliser spécifiquement pour les fenêtres, plus de puissance pour vous.

0
ajouté