27

我有一个 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

4 回答 4

10

在 Windows 上:

import msvcrt
answer=msvcrt.getch()
于 2008-08-05T03:11:55.570 回答
9

在 Linux 上:

  • 设置原始模式
  • 选择并读取击键
  • 恢复正常设置
导入系统
导入选择
导入术语
导入 tty

定义 getkey():
    old_settings = termios.tcgetattr(sys.stdin)
    tty.setraw(sys.stdin.fileno())
    select.select([sys.stdin], [], [], 0)
    答案 = sys.stdin.read(1)
    termios.tcsetattr(sys.stdin,termios.TCSADRAIN,old_settings)
    返回答案

打印"""菜单
1) 说 Foo
2) 说吧"""

答案=getkey()

如果答案为“1”:打印“foo”
elif "2" 回答:打印 "bar"

于 2008-08-05T02:54:54.577 回答
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 中尝试过。

我已经忘记了我是如何使用不是超级即时响应的菜单生活的。

于 2008-08-05T03:51:57.737 回答
0

msvcrt 在 IDLE 中失败的原因是 IDLE 没有访问运行 msvcrt 的库。而当您在 cmd.exe 中本地运行程序时,它运行良好。与您的程序在 Mac 和 Linux 终端上崩溃的原因相同。

但我想如果你打算专门为窗户使用它,你会更有力量。

于 2008-08-05T04:28:03.747 回答