如何制作一个不需要用户按[enter]选择的菜单?

27 投票
4 回答
14833 浏览
提问于 2025-04-10 23:52

我在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

哇,这真是花了我很多时间。好了,下面是我最后得到的结果。

#!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里运行的时候,它完全崩溃了。IDLE是跟Python一起提供的那个工具。但是当我在DOS(也就是CMD.exe)里试的时候,作为一个真正的程序,它就能正常运行了。

大家不要在IDLE里试这个,除非你手边有任务管理器。

我已经忘了以前是怎么忍受那些反应不够快的菜单的了。

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"

10

在Windows系统上:

import msvcrt
answer=msvcrt.getch()

撰写回答