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

У меня есть меню на 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 ответа

  1. на Linux:

    • установить режим raw
    • выберите и прочитайте нажатие клавиши
    • восстановление нормальных параметров
    импорт sys
    импорт выбрать
    импорт termios
    импорт tty
    
    def getkey():
     old_settings = termios.tcgetattr(sys.стандартный ввод)
     телетайп.setraw (sys.стандартный ввод.fileno())
     выбирать.выберите ([sys.stdin], [], [], 0)
     ответ = sys.стандартный ввод.читать (1)
     termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)
     ответ на запрос
    
    меню печати
    1) Сказать Фу
    2) Сказать Бар"""
    
    ответ=getkey()
    
    если "1" в ответ: печать " foo"
    elif "2" в ответ: печать " bar"
    
    
  2. Вау, это заняло целую вечность. Хорошо, вот что я закончил

    #!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 (ER, CMD.exe), как настоящая программа, то она работала нормально.

    Никто не попробовать его в режиме ожидания, если у вас нет диспетчера задач под рукой.

    Я уже забыл, как я жил с меню, которые arn не супер-мгновенный отзывчивый.

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

    Но я думаю, что если вы собираетесь использовать это специально для windows, больше мощности для ya.