我有一个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...
答案 0 :(得分:9)
在Linux上:
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"
答案 1 :(得分:9)
在Windows上:
import msvcrt
answer=msvcrt.getch()
答案 2 :(得分:4)
#!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中尝试,除非你有方便的任务管理器。
我已经忘记了我的菜单是如何与超级即时响应的菜单一起生活的。
答案 3 :(得分:0)
msvcrt在IDLE中失败的原因是因为IDLE没有访问运行msvcrt的库。而当您在cmd.exe中本机运行该程序时,它可以很好地工作。出于同样的原因,您的程序在Mac和Linux终端上爆炸。
但我想如果你打算专门用于Windows,那就更有能力了。