首页 文章

如何让python等待按下的键

提问于
浏览
400

我希望我的脚本等到用户按任意键 .

我怎么做?

12 回答

  • 353

    简单地使用

    input("Press Enter to continue...")
    

    将导致语法错误:解析时预期的EOF .

    简单修复使用:

    try:
        input("Press enter to continue")
    except SyntaxError:
        pass
    
  • 14

    如果你想等待输入(因此用户敲击键盘不会导致无意中发生的事情)使用

    sys.stdin.readline()
    
  • 1

    我不知道采用独立于平台的方式,但在Windows下,如果使用msvcrt模块,则可以使用其getch函数:

    import msvcrt
    c = msvcrt.getch()
    print 'you entered', c
    

    mscvcrt还包括非阻塞kbhit()函数,用于查看是否按下键而不等待(不确定是否存在相应的curses函数) . 在UNIX下,有curses包,但不确定是否可以在不使用它的情况下使用它来进行所有屏幕输出 . 此代码适用于UNIX:

    import curses
    stdscr = curses.initscr()
    c = stdscr.getch()
    print 'you entered', chr(c)
    curses.endwin()
    

    请注意,curses.getch()返回按下的键的序号,以使其具有我必须输出的相同输出 .

  • 0

    在Python 3中,不存在 raw_input() . 所以,只需使用:

    input("Press Enter to continue...")
    

    这只等待用户按Enter键,因此您可能希望使用 msvcrt ((仅限Windows / DOS)msvcrt模块允许您访问Microsoft Visual C / C运行时库(MSVCRT)中的许多函数):

    import msvcrt as m
    def wait():
        m.getch()
    

    这应该等待按键 .

  • 25

    如果您可以依赖系统命令,则可以使用以下命令:

    Linux的:

    os.system('read -s -n 1 -p "Press any key to continue..."')
    print
    

    视窗:

    os.system("pause")
    
  • 47

    如果你想看看他们是否按下了一个确切的键(比如说'b')这样做:

    while True:
        choice = raw_input("> ")
    
        if choice == 'b' :
            print "You win"
            input("yay")
            break
    
  • 2

    在Python 2中执行此操作的一种方法是使用 raw_input()

    raw_input("Press Enter to continue...")
    

    在python3中它只是 input()

  • 0

    我是python的新手,我一直在想我太愚蠢了,无法重现这里提出的最简单的建议 . 事实证明,有一个应该知道的陷阱:

    当从IDLE执行python脚本时,一些IO命令似乎表现完全不同(因为实际上没有终端窗口) .

    例如 . msvcrt.getch是非阻塞的,总是返回$ ff . 这已经在很久以前就已经报道了(参见例如https://bugs.python.org/issue9290) - 并且它被标记为已修复,不知何故问题似乎在当前版本的python / IDLE中仍然存在 .

    因此,如果上面发布的任何代码对您不起作用,请尝试手动运行脚本,并且 NOT from IDLE .

  • 20

    python manual提供以下内容:

    import termios, fcntl, sys, os
    fd = sys.stdin.fileno()
    
    oldterm = termios.tcgetattr(fd)
    newattr = termios.tcgetattr(fd)
    newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
    termios.tcsetattr(fd, termios.TCSANOW, newattr)
    
    oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
    
    try:
        while 1:
            try:
                c = sys.stdin.read(1)
                print "Got character", repr(c)
            except IOError: pass
    finally:
        termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
        fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
    

    这可以卷入你的用例 .

  • 12

    Cross Platform, Python 2/3 code:

    # import sys, os
    
    def wait_key():
        ''' Wait for a key press on the console and return it. '''
        result = None
        if os.name == 'nt':
            import msvcrt
            result = msvcrt.getch()
        else:
            import termios
            fd = sys.stdin.fileno()
    
            oldterm = termios.tcgetattr(fd)
            newattr = termios.tcgetattr(fd)
            newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
            termios.tcsetattr(fd, termios.TCSANOW, newattr)
    
            try:
                result = sys.stdin.read(1)
            except IOError:
                pass
            finally:
                termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
    
        return result
    

    我删除了fctl / non-blocking的东西,因为它给了 IOError s并且我没有't need it. I' m使用这段代码,因为我希望它阻止 . ;)

  • 13

    os.system似乎总是调用sh,它不识别读取的s和n选项 . 但是,read命令可以传递给bash:

    os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")
    
  • 297

    在我的Linux机器上,我使用以下代码 . 这类似于其他地方提到的manual条目,但该代码在紧密循环中旋转,此代码不会解释此代码所做的事情 .

    def read_single_keypress():
        """Waits for a single keypress on stdin.
    
        This is a silly function to call if you need to do it a lot because it has
        to store stdin's current setup, setup stdin for reading single keystrokes
        then read the single keystroke then revert stdin back after reading the
        keystroke.
    
        Returns the character of the key that was pressed (zero on
        KeyboardInterrupt which can happen when a signal gets handled)
    
        """
        import termios, fcntl, sys, os
        fd = sys.stdin.fileno()
        # save old state
        flags_save = fcntl.fcntl(fd, fcntl.F_GETFL)
        attrs_save = termios.tcgetattr(fd)
        # make raw - the way to do this comes from the termios(3) man page.
        attrs = list(attrs_save) # copy the stored version to update
        # iflag
        attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK 
                      | termios.ISTRIP | termios.INLCR | termios. IGNCR 
                      | termios.ICRNL | termios.IXON )
        # oflag
        attrs[1] &= ~termios.OPOST
        # cflag
        attrs[2] &= ~(termios.CSIZE | termios. PARENB)
        attrs[2] |= termios.CS8
        # lflag
        attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON
                      | termios.ISIG | termios.IEXTEN)
        termios.tcsetattr(fd, termios.TCSANOW, attrs)
        # turn off non-blocking
        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK)
        # read a single keystroke
        try:
            ret = sys.stdin.read(1) # returns a single character
        except KeyboardInterrupt: 
            ret = '\x03'
        finally:
            # restore old state
            termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
            fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
        return ret
    

相关问题