Python Key press y Key Release Listener

Estoy controlando un carro de juguete remoto usando el código de Python. A partir de ahora, el código es el siguiente

def getkey(): fd = sys.stdin.fileno() old = termios.tcgetattr(fd) new = termios.tcgetattr(fd) new[3] = new[3] & ~TERMIOS.ICANON & ~TERMIOS.ECHO new[6][TERMIOS.VMIN] = 1 new[6][TERMIOS.VTIME] = 0 termios.tcsetattr(fd, TERMIOS.TCSANOW, new) c = None try: c = os.read(fd, 1) finally: termios.tcsetattr(fd, TERMIOS.TCSAFLUSH, old) return c def car(): while True: key = getkey() if key == 's': #Down arrow print "Down" Backward() elif key == 'w': #Up arrow print "Up" forward() elif key == 'a': print "left" Left() elif key == 'd': print "Right" Right() elif key == 'q': #Quit print "That's It" break def forward(): GPIO.output(11,True) #Move forward 

Cuando presiono el método ‘w’ forward () se llama y el automóvil avanza pero no se detiene hasta que salga del progtwig o llame a GPIO.output (11, Flase) desde otro método.

¿Hay alguna escucha de clave que detecte la liberación de una clave en particular?

Por ejemplo, si se presionó ‘w’, se llamó a este método y si se liberó, se debe llamar a algún otro método

Código sudo

 if w_isPressed() forward() else if w_isReleased() stop() 

He visto cómo la biblioteca de desarrollo de juegos Pygame se usaba exitosamente en escenarios similares antes, manejando sistemas en tiempo real y maquinaria en producción, no solo ejemplos de juguetes. Creo que es un candidato adecuado aquí también. Consulte el módulo pygame.key para ver qué se puede hacer con la entrada del teclado.

En resumen, si no está familiarizado con el desarrollo de juegos, básicamente sondea continuamente eventos como cambios de estado de entrada dentro de un bucle de juego ‘infinito’ y reactjs en consecuencia. Normalmente se actualizan los parámetros del sistema utilizando deltas por el tiempo transcurrido. Hay un montón de tutoriales sobre eso y Pygame está disponible y los documentos de Pygame son bastante sólidos.

Un simple ejemplo de cómo hacerlo:

 import pygame pygame.init() # to spam the pygame.KEYDOWN event every 100ms while key being pressed pygame.key.set_repeat(100, 100) while 1: for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_w: print 'go forward' if event.key == pygame.K_s: print 'go backward' if event.type == pygame.KEYUP: print 'stop' 

Tendrá que jugar con pygame.KEYDOWN , pygame.KEYUP y pygame.key.set_repeat dependiendo de cómo se implemente el movimiento de su automóvil.

Enfrenté un problema similar (no soy un experto en Python) pero esto me funcionó

 import pynput from pynput import keyboard def on_press(key): try: print('Key {0} pressed'.format(key.char)) #Add your code to drive motor except AttributeError: print('Key {0} pressed'.format(key)) #Add Code def on_release(key): print('{0} released'.format(key)) #Add your code to stop motor if key == keyboard.Key.esc: # Stop listener # Stop the Robot Code return False # Collect events until released with keyboard.Listener( on_press=on_press, on_release=on_release) as listener: listener.join()