398 votos

¿Cómo puedo hacer python que esperar a una tecla pulsada

Quiero que mi script para esperar a que mis usuarios presiona cualquier tecla.

¿Cómo puedo hacer eso?

350voto

riza Puntos 2645

En Python 3, no existe raw_input (). Así, sólo tiene que utilizar:

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

esto sólo espera a que el usuario pulse Intro sin embargo, así que puede que quieras usar (sólo para Windows):

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

este debe esperar a que se presione una tecla

297voto

Greg Hewgill Puntos 356191

Una forma de hacer esto en Python 2, es usar raw_input() :

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

47voto

mheyman Puntos 795

En mi caja linux, yo uso el siguiente código. Esto es similar a la manual de entrada mencionado en otra parte, sino que el código gira en un bucle estrecho, donde el código no hace y hay un montón de casos de esquina impares ese código no tiene en cuenta que este código 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 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 = 0
    finally:
        # restore old state
        termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
    return ret
 

14voto

SlashV Puntos 418

La pitón Manual ofrece lo siguiente:

 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)
 

que se puede rodar en su caso de uso.

13voto

John Gaines Jr. Puntos 4127

No sé de una manera independiente a la plataforma de hacerlo, pero en Windows, si usas el msvcrt módulo, usted puede utilizar su función getch:

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

mscvcrt también incluye el no-bloqueo de kbhit() función para ver si se presiona una tecla sin tener que esperar (no sé si hay un correspondiente maldiciones de la función). Bajo UNIX, existen las maldiciones paquete, pero no estoy seguro si se puede usar sin usar durante toda la salida en pantalla. Este código funciona en UNIX:

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

Tenga en cuenta que curses.getch() devuelve el número ordinal de la tecla que se ha presionado para que sea tienen la misma salida que yo tenía para lanzarla.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X