代码之家  ›  专栏  ›  技术社区  ›  Grant

如何制作不需要用户按[Enter]进行选择的菜单?

  •  23
  • Grant  · 技术社区  · 16 年前

    我有一份用蟒蛇做的菜单。那部分很容易。我在用 raw_input() 从用户中获取选择。

    问题是 raw_input (和输入)要求用户按 进入 在他们做出选择之后。有没有什么方法可以使程序在击键时立即生效?以下是我目前为止的情况:

    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 回复  |  直到 16 年前
        1
  •  9
  •   Mark Harrison    16 年前

    在Windows上:

    import msvcrt
    answer=msvcrt.getch()
    
        2
  •  9
  •   Mark Harrison    16 年前

    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"
    
    
        3
  •  4
  •   Grant    16 年前

    哇,那花了很长时间。好吧,这就是我的结局

    #!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)中尝试了它,作为一个真正的程序,它运行得很好。

    除非你手头有任务管理器,否则没有人在空闲时尝试它。

    我已经忘记了我是如何生活在菜单上的,它不是超级即时响应的。

        4
  •  0
  •   helloandre    16 年前

    msvcrt在空闲状态下失败的原因是idle无法访问运行msvcrt的库。然而,当您在cmd.exe中本机运行程序时,它工作得很好。同样的原因是你的程序在Mac和Linux终端上崩溃了。

    但我想如果你想把它专门用于Windows,那就给你更多的动力吧。