Comment puis-je faire un menu qui ne nécessite pas l'utilisateur d'appuyer sur [ENTER] pour faire une sélection?

voix
23

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 entrée) exigent que l'utilisateur presse Enteraprès une sélection. Est - il possible de faire l'acte de programme immédiatement sur une combinaison de touches? Voici ce que j'ai à ce jour:

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...
Créé 05/08/2008 à 03:39
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
9

Sous Windows:

import msvcrt
answer=msvcrt.getch()
Créé 05/08/2008 à 04:11
source utilisateur

voix
9

Sous Linux:

  • mettre en mode brut
  • sélectionner et lire la séquence de touches
  • restaurer les paramètres normaux
import sys
sélectionnez l'importation
termios importation
TTY import

def getkey ():
    old_settings = termios.tcgetattr (sys.stdin)
    tty.setraw (sys.stdin.fileno ())
    select.select ([sys.stdin], [], [], 0)
    réponse = sys.stdin.read (1)
    termios.tcsetattr (sys.stdin, termios.TCSADRAIN, old_settings)
    réponse de retour

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

answer = getkey ()

si "1" en réponse: print "foo"
Elif "2" en réponse: print "bar"

Créé 05/08/2008 à 03:54
source utilisateur

voix
4

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 en utilisant dur IDLE, le python ... chose ... qui vient avec python. Mais une fois que je l'ai essayé dans le DOS (er, cmd.exe), comme un vrai programme, il a fonctionné très bien.

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

Je l'ai déjà oublié comment je vivais avec des menus qui arn't super-instantanée réactif.

Créé 05/08/2008 à 04:51
source utilisateur

voix
0

La raison msvcrt échoue en IDLE est parce que IDLE n'accède pas à la bibliothèque qui fonctionne msvcrt. Alors que lorsque vous exécutez le programme en mode natif 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 utiliser ce spécifiquement pour les fenêtres, plus de puissance à toi.

Créé 05/08/2008 à 05:28
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more