Estoy haciendo un cronómetro tipo de programa en python y me gustaría saber cómo detectar si se pulsa una tecla (como la p para pausar y s para parar), y no me gustaría que fuera algo como raw_input que espera la entrada del usuario antes de continuar con la ejecución. Alguien sabe cómo hacer esto en un bucle while?

También, me gustaría hacer esta cruz-plataforma, pero si eso no es posible, entonces mi principal meta del desarrollo es linux

posibles duplicados de ¿Cómo puedo construir un contador en python?
para OS X, stackoverflow.com/a/47197390/5638869 funciona en Python 2 y 3

OriginalEl autor lobuo | 2014-06-06

9 Comentarios

  1. 28

    Python tiene una teclado módulo con muchas características. Instalar, tal vez con este comando:

    pip3 install keyboard

    A continuación, utilizarlo en el código como:

    import keyboard  # using module keyboard
    while True:  # making a loop
        try:  # used try so that if user pressed other than the given key error will not be shown
            if keyboard.is_pressed('q'):  # if key 'q' is pressed 
                print('You Pressed A Key!')
                break  # finishing the loop
            else:
                pass
        except:
            break  # if user pressed a key other than the given key the loop will break
    No estoy seguro de para linux, pero funciona en Windows para mí.
    keyboard al parecer requiere de root en linux :/
    He probado esta solución, pero cuando trato de importar el módulo después de instalarlo, me sale un «ImportError: No module named ‘teclado'», por lo que no funciona. He comprobado en la repo de GitHub y me encuentro con la un problema relacionado con la, pero no resolverme el problema. Luego, he intentado descargar de la repo y la ejecución de algunos de sus ejemplos, pero me llega la «ImportError: debe ser root para utilizar esta librería en linux», como @Inaimathi comentado antes. Aparentemente parece un completo módulo para la gestión de teclado con Python, pero la exigencia de la raíz es una gran falta 🙁
    «Para evitar depender de X, Linux piezas lee raw archivos de dispositivo (/dev/input/entrada*) pero este requries de la raíz.»
    No veo por qué iba a tratar: excepto: ser útil.

    OriginalEl autor

  2. 13

    Como OP mención sobre raw_input – eso significa que él quiere cli solución.
    Linux: maldiciones es lo que quieres (windows PDCurses). Maldiciones, es una gráfica de la API para la cli del software, usted puede lograr más que detectar los eventos clave.

    Este código detecta las teclas hasta que la nueva línea se presiona.

    import curses
    import os
    
    def main(win):
        win.nodelay(True)
        key=""
        win.clear()                
        win.addstr("Detected key:")
        while 1:          
            try:                 
               key = win.getkey()         
               win.clear()                
               win.addstr("Detected key:")
               win.addstr(str(key)) 
               if key == os.linesep:
                  break           
            except Exception as e:
               # No input   
               pass         
    
    curses.wrapper(main)
    Esto es realmente agradable. Había que buscar siempre antes de venir a través de ella. Parece mucho más limpio que el de cortar a su alrededor con termios y así sucesivamente …
    necesario para agregar import os con el fin de ser capaz de salir de salir de el ejemplo.

    OriginalEl autor Abc Xyz

  3. 7

    Para Windows usted podría utilizar msvcrt como este:

       import msvcrt
       while True:
           if msvcrt.kbhit():
               key = msvcrt.getch()
               print(key)   # just to show the result
    msvcrt es sólo para Windows módulo.
    En realidad yo uso pynput ahora, que podría ser una mejor respuesta
    Tenga en cuenta que pynput para trabajar en OS X (no sé acerca de Linux) debe ejecutarse como root para que funcione. Que puede ser un non-starter para algunas personas.
    No es trabajo para mí (Windows 8).

    OriginalEl autor Benjie

  4. 7

    Para aquellos que están en windows y estaban luchando por encontrar una respuesta aquí está la mía: pynput

    from pynput.keyboard import Key, Listener
    
    def on_press(key):
        print('{0} pressed'.format(
            key))
    
    def on_release(key):
        print('{0} release'.format(
            key))
        if key == Key.esc:
            # Stop listener
            return False
    
    # Collect events until released
    with Listener(
            on_press=on_press,
            on_release=on_release) as listener:
        listener.join()

    La función anterior imprimirá lo clave que usted está presionando además de iniciar una acción como suelte la tecla ‘esc’. La documentación del teclado es aquí para una más variated uso.

    OriginalEl autor Mitrek

  5. 4

    Usar PyGame para tener una ventana y, a continuación, usted puede obtener la llave de eventos.

    Para la letra p:

    import pygame, sys
    import pygame.locals
    
    pygame.init()
    BLACK = (0,0,0)
    WIDTH = 1280
    HEIGHT = 1024
    windowSurface = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)
    
    windowSurface.fill(BLACK)
    
    while True:
        for event in pygame.event.get():
            if event.key == pygame.K_p:
                 #Do what you want to here
                 pass
            if event.type == pygame.locals.QUIT:
                 pygame.quit()
                 sys.exit()

    OriginalEl autor A.J. Uppal

  6. 1

    Yo sugeriría usar PyGame y agregar un controlador de eventos.

    http://www.pygame.org/docs/ref/event.html

    Mientras que este vínculo puede responder a la pregunta, es mejor incluir a las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Enlace-sólo respuestas puede ser válido si la página enlazada cambios. – De Revisión
    Este es de 4 años de edad.

    OriginalEl autor Madison Courto

  7. 1

    Así que he hecho esta ..tipo de juego.. basado en este post (utilizando msvcr biblioteca y Python 3.7).

    La siguiente es la «función principal» del juego, que es la detección de las teclas presionadas:

    # Requiered libraries - - - -
    import msvcrt
    # - - - - - - - - - - - - - -
    
    
    def _secret_key(self):
        # Get the key pressed by the user and check if he/she wins.
    
        bk = chr(10) + "-"*25 + chr(10)
    
        while True:
    
            print(bk + "Press any key(s)" + bk)
            #asks the user to type any key(s)
    
            kp = str(msvcrt.getch()).replace("b'", "").replace("'", "")
            # Store key's value.
    
            if r'\xe0' in kp:
                kp += str(msvcrt.getch()).replace("b'", "").replace("'", "")
                # Refactor the variable in case of multi press.
    
            if kp == r'\xe0\x8a':
                # If user pressed the secret key, the game ends.
                # \x8a is CTRL+F12, that's the secret key.
    
                print(bk + "CONGRATULATIONS YOU PRESSED THE SECRET KEYS!\a" + bk)
                print("Press any key to exit the game")
                msvcrt.getch()
                break
            else:
                print("    You pressed:'", kp + "', that's not the secret key(s)\n")
                if self.select_continue() == "n":
                    if self.secondary_options():
                        self._main_menu()
                    break

    Si quieres el código fuente completo de la porgram se puede ver o descargar desde aquí:

    La Clave Secreta Del Juego (GitHub)

    (nota: el secreto de pulsación de teclas: CTRL+F12)

    Espero que pueda servir de ejemplo y de ayuda para aquellos que vienen a consultar esta información.

    Saludos!

    OriginalEl autor Ferd

  8. 1

    Utilizar este código para encontrar la clave que se pulsa

    from pynput import keyboard
    
    def on_press(key):
        try:
            print('alphanumeric key {0} pressed'.format(
                key.char))
        except AttributeError:
            print('special key {0} pressed'.format(
                key))
    
    def on_release(key):
        print('{0} released'.format(
            key))
        if key == keyboard.Key.esc:
            # Stop listener
            return False
    
    # Collect events until released
    with keyboard.Listener(
            on_press=on_press,
            on_release=on_release) as listener:
        listener.join()
    Aquí está la cosa, aunque, estoy usando macOS e instalado tanto pynput y el teclado por separado, y el programa se ejecuta sin errores, pero sólo puede detectar (en el interprete de python) teclas especiales. Teclas alfanuméricas no son detectados y, por el contrario, se consideran como si yo fuera a escribir código en la concha. ¿Sabes lo que podría ser el problema?
    El mismo código que funcionó para mí en el shell. Por favor, compruebe. El teclado paquete no necesita de este código.

    OriginalEl autor Manivannan Murugavel

  9. 0

    clave = cv2.waitKey(1)

    Esto es desde el openCV paquete.
    Se detecta una pulsación de tecla sin tener que esperar.

    OriginalEl autor jms

Dejar respuesta

Please enter your comment!
Please enter your name here