Comment créer un menu qui ne nécessite pas que l'utilisateur appuie sur [Entrée] pour effectuer une sélection ?

StackOverflow https://stackoverflow.com/questions/1829

  •  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...
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top