Как сделать меню, в котором пользователю не требуется нажимать [ввод] для выбора?

У меня есть меню на Python. Эта часть была легкой. Я использую, raw_input() чтобы получить выбор от пользователя.

Проблема в том, что raw_input (и ввод) требует от пользователя нажатия Enterпосле того, как он сделает выбор. Есть ли способ заставить программу действовать сразу после нажатия клавиши? Вот что у меня есть на данный момент:

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"

Было бы здорово иметь что-нибудь вроде

print menu
while lastKey = "":
    lastKey = check_for_recent_keystrokes()
if "1" in lastKey: #do stuff...

Ответов (4)

Решение

В Windows:

import msvcrt
answer=msvcrt.getch()

Причина сбоя msvcrt в IDLE заключается в том, что IDLE не обращается к библиотеке, в которой выполняется msvcrt. В то время как при запуске программы в cmd.exe она работает нормально. По той же причине, по которой ваша программа взрывается на терминалах Mac и Linux.

Но я думаю, если вы собираетесь использовать это специально для окон, вам больше возможностей.

Вау, это заняло целую вечность. Хорошо, вот что у меня получилось

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

Он терпит неудачу при использовании IDLE, python ... штуки ... которая идет с python. Но как только я попробовал ее в DOS (например, CMD.exe) как настоящую программу, она заработала нормально.

Никто не пробует это в IDLE, если у вас под рукой нет диспетчера задач.

Я уже забыл, как жил с меню, которое не реагирует на мгновение.

В Linux:

  • установить необработанный режим
  • выберите и прочтите нажатие клавиши
  • восстановить нормальные настройки
import sys
выбрать импорт
импортные термины
импорт 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)
    ответный ответ

распечатать "" "Меню
1) Скажи Фу
2) Скажите бар "" "

answer = getkey ()

если в ответе «1»: выведите «foo»
elif "2" в ответ: print "bar"