una teclas teclado tecla pulse pulsada por para leer lectura interrupcion detectar datos continuar como python wait keyboard-input

teclas - tecla pulsada python



¿Cómo hago Python para esperar una tecla presionada (12)

El manual python proporciona 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 puede ser enrollado en su caso de uso

Quiero que mi script espere hasta que el usuario presione cualquier tecla.

¿Cómo puedo hacer eso?


En mi caja de linux, uso el siguiente código. Esto es similar a la entrada manual menciona en otra parte, pero ese código gira en un circuito cerrado donde este código no lo hace y hay muchos casos extraños en las esquinas en los que el código no tiene en cuenta lo que hace este código.

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


No conozco una forma de hacerlo independiente de la plataforma, pero en Windows, si usa el módulo msvcrt, puede usar su función getch:

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

mscvcrt también incluye la función kbhit () no bloqueante para ver si se presionó una tecla sin esperar (no estoy seguro de si hay una función de cursas correspondiente). Bajo UNIX, está el paquete de curses, pero no está seguro si puede usarlo sin usarlo para todos los resultados de la pantalla. Este código funciona bajo UNIX:

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

Tenga en cuenta que curses.getch () devuelve el ordinal de la tecla presionada para que tenga la misma salida que tuve que lanzarla.


Si desea esperar a que ingrese (para que el usuario toque el teclado no cause que ocurra algo inesperado) use

sys.stdin.readline()


Si desea ver si presionaron una tecla exacta (como decir ''b'') haga esto:

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


Si estás de acuerdo con los comandos del sistema, puedes usar lo siguiente:

Linux:

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

Windows:

os.system("pause")


Simplemente usando

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

causará un SyntaxError: EOF esperado al analizar.

Uso de corrección simple:

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


Soy nuevo en Python y ya estaba pensando que soy demasiado estúpido para reproducir las sugerencias más simples que se hacen aquí. Resulta que hay una trampa que uno debe saber:

Cuando se ejecuta un script en python desde IDLE, algunos comandos IO parecen comportarse de manera completamente diferente (ya que en realidad no hay una ventana de terminal).

P.ej. msvcrt.getch no bloquea y siempre devuelve $ ff. Esto ya se informó hace mucho tiempo (ver, por ejemplo, https://bugs.python.org/issue9290 ) - y está marcado como corregido, de alguna manera el problema parece persistir en las versiones actuales de python / IDLE.

Entonces, si alguno de los códigos publicados anteriormente no funciona para usted, intente ejecutar el script manualmente y NO desde IDLE .


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

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

En Python3 es solo input()


os.system parece invocar siempre sh, que no reconoce las opciones s y n para leer. Sin embargo, el comando de lectura se puede pasar a bash:

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


Plataforma cruzada, código de Python 2/3:

# 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

Quité el material fctl / non-block porque estaba dando IOError s y no lo necesitaba. Estoy usando este código específicamente porque quiero que se bloquee. ;)


En Python 3, no existe raw_input() . Entonces, solo usa:

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

Sin embargo, esto solo espera a que un usuario presione Intro, por lo que es posible que desee usar msvcrt ((solo Windows / DOS) El módulo msvcrt le da acceso a varias 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 una pulsación de tecla.