¿Cómo espero a que se presione una tecla?

Resuelto Janusz asked hace 15 años • 13 respuestas

¿Cómo hago para que mi script de Python espere hasta que el usuario presione cualquier tecla?

Janusz avatar Jun 12 '09 03:06 Janusz
Aceptado

En Python 3 , use input():

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

En Python 2 , use raw_input():

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

Sin embargo, esto solo espera a que el usuario presione Intro.


En Windows/DOS, es posible que desee utilizar msvcrt. El msvcrtmódulo le brinda acceso a una serie de funciones en la biblioteca de tiempo de ejecución de Microsoft Visual C/C++ (MSVCRT):

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

Esto debería esperar a que se presione una tecla.


Notas:

En Python 3, raw_input()no existe.
En Python 2, input(prompt)es equivalente a eval(raw_input(prompt)).

riza avatar Jul 16 '2009 01:07 riza

En Python 3, use input():

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

En Python 2, use raw_input():

raw_input("Press Enter to continue...")
Greg Hewgill avatar Jun 11 '2009 20:06 Greg Hewgill

En mi máquina Linux, uso el siguiente código. Esto es similar al código que he visto en otros lugares (en las antiguas preguntas frecuentes de Python, por ejemplo), pero ese código gira en un bucle cerrado donde este código no lo hace y hay muchos casos extraños en los que el código no tiene en cuenta esto. el código lo hace.

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 a tuple of characters of the key that was pressed - on Linux, 
    pressing keys like up arrow results in a sequence of characters. Returns 
    ('\x03',) 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
    ret = []
    try:
        ret.append(sys.stdin.read(1)) # returns a single character
        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save | os.O_NONBLOCK)
        c = sys.stdin.read(1) # returns a single character
        while len(c) > 0:
            ret.append(c)
            c = sys.stdin.read(1)
    except KeyboardInterrupt:
        ret.append('\x03')
    finally:
        # restore old state
        termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
    return tuple(ret)
mheyman avatar Jul 06 '2011 15:07 mheyman