Estoy haciendo un programa de tipo cronómetro en Python y me gustaría saber cómo detectar si se presiona una tecla (como p para pausa y s para detener), y no me gustaría que fuera algo como raw_input que espera el entrada del usuario antes de continuar con la ejecución. ¿Alguien sabe cómo hacer esto en un bucle while?
Además, me gustaría hacer esta plataforma multiplataforma, pero si eso no es posible, entonces mi principal objetivo de desarrollo es Linux.
python
python-2.7
keypress
detect
lobuo
fuente
fuente
Respuestas:
Python tiene un módulo de teclado con muchas funciones. Instálelo, quizás con este comando:
Luego úselo en un código como:
fuente
keyboard
aparentemente requiere root en linux: /Para aquellos que están en Windows y estaban luchando por encontrar una respuesta que funcione, aquí está la mía: pynput
La función anterior imprimirá cualquier tecla que esté presionando e iniciará una acción cuando suelte la tecla 'esc'. La documentación del teclado está aquí para un uso más variado.
Markus von Broady destacó un problema potencial que es: Esta respuesta no requiere que esté en la ventana actual para activar este script, una solución para Windows sería:
fuente
Como OP menciona sobre raw_input, eso significa que quiere una solución cli. Linux: curses es lo que quieres (Windows PDCurses). Curses, es una API gráfica para software cli, puede lograr más que solo detectar eventos clave.
Este código detectará teclas hasta que se presione una nueva línea.
fuente
termios
y así sucesivamente ...import os
para poder salir, salir del ejemplo.win.nodelay(False)
lugar deTrue
, no generará un millón de excepciones por segundo.Hay más cosas que se pueden hacer con
keyboard
module.Estos son algunos de los métodos:
Método 1:
Usando la función
read_key()
:Esto romperá el ciclo cuando pse presione la tecla .
Método # 2:
Función de uso
wait
:Esperará a que presione py continúe el código mientras se presiona.
Método # 3:
Usando la función
on_press_key
:Necesita una función de devolución de llamada. Lo usé
_
porque la función del teclado devuelve el evento del teclado a esa función.Una vez ejecutada, ejecutará la función cuando se presione la tecla. Puede detener todos los ganchos ejecutando esta línea:
Método # 4:
Este método ya ha sido respondido por user8167727 pero no estoy de acuerdo con el código que hicieron. Estará usando la función
is_pressed
pero de otra manera:Romperá el bucle cuando pse presione.
Notas:
keyboard
leerá las pulsaciones de teclas de todo el sistema operativo.keyboard
requiere root en linuxfuente
keyboard.wait()
esperar más de una tecla y continuar si se presiona alguna de ellaswait()
no ofrece esta funcionalidad. Tendrá que usarlokeyboard.read_key()
con una condición if empaquetada en un bucle while. Vea el método # 1suppress
uso de palabras clave enkeyboard.read_key()
, cuándo usarlas y cuándo no ...?Para Windows se puede utilizar
msvcrt
así:fuente
Use este código para encontrar la tecla presionada
fuente
Use PyGame para tener una ventana y luego puede obtener los eventos clave.
Para la carta
p
:fuente
Así que hice este ... tipo de juego ... basado en esta publicación (usando la biblioteca msvcr y Python 3.7).
La siguiente es la "función principal" del juego, que es detectar las teclas presionadas:
Si quieres el código fuente completo del programa puedes verlo o descargarlo desde aquí:
El juego de la clave secreta (GitHub)
(nota: la pulsación de tecla secreta es: Ctrl+ F12)
Espero que pueda servir de ejemplo y ayuda para quienes vengan a consultar esta información.
fuente
Le sugiero que use PyGame y agregue un identificador de evento.
http://www.pygame.org/docs/ref/event.html
fuente
Esto es del paquete openCV. Detecta una pulsación de tecla sin esperar.
fuente