Подтвердить что ты не робот

Как создать меню, которое не требует, чтобы пользователь нажал [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...
4b9b3361

Ответ 1

В Windows:

import msvcrt
answer=msvcrt.getch()

Ответ 2

В Linux:

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

Ответ 3

Вау, это навсегда. Хорошо, вот что я закончил с

#!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), как в реальной программе, тогда он работал нормально.

Никто не пытается в IDLE, если у вас нет менеджера задач.

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

Ответ 4

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

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