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

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

  •  08-06-2019
  •  | 
  •  

Pergunta

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

O problema é que raw_input (e entrada) exigem que o usuário pressione Digitar depois de fazerem uma seleção.Existe alguma maneira de fazer o programa agir imediatamente após pressionar uma tecla?Aqui está o que 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...
Foi útil?

Solução

No Windows:

import msvcrt
answer=msvcrt.getch()

Outras dicas

No Linux:

  • definir modo bruto
  • selecione e leia o pressionamento de tecla
  • restaurar as configurações normais
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"

Uau, isso demorou uma eternidade.Ok, aqui está o que acabei

#!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 muito usando IDLE, o python...coisa...que vem com o python.Mas uma vez que tentei no DOS (er, CMD.exe), como um programa real, funcionou bem.

Ninguém tenta fazer isso no IDLE, a menos que você tenha o Gerenciador de Tarefas em mãos.

Já esqueci como convivi com menus que não respondem instantaneamente.

A razão pela qual o msvcrt falha no IDLE é porque o IDLE não está acessando a biblioteca que executa o msvcrt.Considerando que quando você executa o programa nativamente em cmd.exe ele funciona bem.Pela mesma razão que seu programa explode em terminais Mac e Linux.

Mas acho que se você for usar isso especificamente para Windows, mais poder para você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top