Como posso fazer um menu que não exige que o usuário pressione [ENTER] para fazer uma seleção?

votos
23

Eu tenho um menu em Python. Essa parte foi fácil. Eu estou usando raw_input()para obter a seleção do usuário.

O problema é que raw_input(e entrada) exigem que o usuário pressione Enterdepois de fazer uma seleção. Existe alguma maneira de fazer o ato programa imediatamente após uma combinação de teclas? Aqui está o que eu tenho até agora:

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

Seria ótimo ter algo como

print menu
while lastKey = :
    lastKey = check_for_recent_keystrokes()
if 1 in lastKey: #do stuff...
Publicado 05/08/2008 em 03:39
fonte usuário
Em outras línguas...                            


4 respostas

votos
9

No Windows:

import msvcrt
answer=msvcrt.getch()
Respondeu 05/08/2008 em 04:11
fonte usuário

votos
9

No Linux:

  • definir o modo cru
  • selecionar e ler o keystroke
  • restaurar as configurações normais
sys importação
importação selecione
termios importação
tty importação

getKey def ():
    old_settings = termios.tcgetattr (sys.stdin)
    tty.setraw (sys.stdin.fileno ())
    select.select ([sys.stdin], [], [], 0)
    = resposta sys.stdin.read (1)
    termios.tcsetattr (sys.stdin, termios.TCSADRAIN, old_settings)
    resposta de retorno

print "" "Menu
1) dizem Foo
2) Diga Bar """

responder = getKey ()

Se "1" na resposta: print "foo"
elif "2" na resposta: print "bar"

Respondeu 05/08/2008 em 03:54
fonte usuário

votos
4

Uau, que tomou para sempre. Ok, aqui está o que eu acabei com

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

Ele falha rígido usando IDLE, o python ... coisa ... que vem com python. Mas uma vez eu tentei em DOS (er, CMD.exe), como um programa real, então funcionou muito bem.

Ninguém experimentá-lo em IDLE, a menos que você tem o Gerenciador de Tarefas calhar.

Eu já esqueci como eu vivi com menus que arn't super-instantâneas responsivo.

Respondeu 05/08/2008 em 04:51
fonte usuário

votos
0

A razão msvcrt falha em IDLE é porque IDLE não está acessando a biblioteca que funciona msvcrt. Considerando que, quando você executar o programa de forma nativa em cmd.exe ele funciona muito bem. Pela mesma razão que o seu programa explode em terminais Mac e Linux.

Mas eu acho que se você vai estar usando este especificamente para o Windows, mais poder para ya.

Respondeu 05/08/2008 em 05:28
fonte usuário

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