python - Comment créer un menu qui n'oblige pas l'utilisateur à appuyer sur [entrée] pour faire une sélection?

Translate

J'ai un menu en Python. Cette partie était facile. j'utiliseraw_input()pour obtenir la sélection de l'utilisateur.

Le problème est queraw_input(et l'entrée) exigent que l'utilisateur appuie surEntreraprès avoir fait une sélection. Existe-t-il un moyen de faire agir le programme immédiatement sur une touche? 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...
This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Sous Windows:

import msvcrt
answer=msvcrt.getch()
La source
Translate

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"

La source
Translate

Wow, cela 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 dur en utilisant IDLE, la chose python ... qui vient avec python. Mais une fois que je l'ai essayé sous DOS (euh, CMD.exe), en tant que vrai programme, il a bien fonctionné.

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

J'ai déjà oublié comment je vivais avec des menus qui ne sont pas réactifs instantanément.

La source
Translate

La raison pour laquelle msvcrt échoue dans IDLE est parce que IDLE n'accède pas à la bibliothèque qui exécute msvcrt. Alors que lorsque vous exécutez le programme nativement 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.

La source