2009-09-08 48 views
28

¿Cómo puedo hacer para "presionar cualquier tecla" (o tomar una opción de menú) en Python?¿Cómo hacer para "presionar cualquier tecla" en python?

  • raw_input requires you hit return.
  • Windows msvcrt tiene getch() y getche().

¿Hay una manera portátil de hacer esto usando las librerías estándar?

+16

¿Dónde está la tecla "cualquiera"? No tengo uno en mi teclado –

+3

+1 para uso obvio de un cliché. –

+2

@Patrick ¿Por qué no tiene la tecla "uno" en su teclado? El resto de los números están bien? ¿Perdiste "1"? ¿O le parece agradable ingresar "1" a través de combinaciones de teclas ASCII? – AneesAhmed777

Respuesta

31
try: 
    # Win32 
    from msvcrt import getch 
except ImportError: 
    # UNIX 
    def getch(): 
     import sys, tty, termios 
     fd = sys.stdin.fileno() 
     old = termios.tcgetattr(fd) 
     try: 
      tty.setraw(fd) 
      return sys.stdin.read(1) 
     finally: 
      termios.tcsetattr(fd, termios.TCSADRAIN, old) 
+0

Intenta ejecutar esto desde un IDE bajo Linux y obtendrás 'termios.error: (22, 'Invalid argument')'. isatty() no es seguro! – sorin

+0

No 'termios' implica que se ejecuta desde un terminal (un' tty' si lo desea)? –

+1

esto no tiene desplazamiento/control/etc. ¿Conoces alguna manera de hacerlo también? – Mala

4

Desde el python docs:

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", `c` 
     except IOError: pass 
finally: 
    termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm) 
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags) 

Esto sólo funciona para las variantes de Unix sin embargo. No creo que haya una forma de plataforma cruzada.

+0

Esta debería ser la solución. –

9
try: 
    os.system('pause') #windows, doesn't require enter 
except whatever_it_is: 
    os.system('read -p "Press any key to continue"') #linux 
+0

-1 para el sistema ('pausa') – ntcong

+1

+1 para él es una solución simple, probablemente lo suficientemente buena para el 90% de todos los casos. – Rook

+1

necesita entrar. – nosklo

0

en la plataforma Linux, yo uso os.system llamar /sbin/getkey de comandos, por ejemplo,

continue_ = os.system('/sbin/getkey -m "Please any key within %d seconds to continue..." -c 10') 
if continue_: 
    ... 
else: 
    ... 

El beneficio es que se mostrará una cuenta atrás del segundo al usuario, muy interesante :)

Hace un par de años
2

escribí una pequeña biblioteca para hacer esto de una manera multiplataforma (directamente inspirada por John Respuesta de Millikin arriba). Además de getch, viene con una función pause que imprime 'Press any key to continue . . .':

pause() 

le puede proporcionar un mensaje personalizado también:

pause('Hit any key') 

Si el siguiente paso es para salir, que también viene con una función de conveniencia que llama sys.exit(status):

pause_exit(status=0, message='Hit any key') 

instalar con pip install py-getch o check it out here.

Cuestiones relacionadas