Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Detección de teclado sin pausar bucle
#1
Buenas a tod@s, Qué tal? primero que nada decir que soy nuevo en python y tengo un problema con este script que estoy haciendo  se trata basicamente en crear un script que consta de dos funciones que se acceder desde un bucle while infinito que también esta pulsando una tecla cada medio segundo. Mi problema radica en la lectura del teclado, ya que para acceder a las dos funciones que tengo quiero hacerlo a través del teclado realice la función y vuelva al  bucle. El bucle siempre tiene que estar en ejecución, por lo tanto tendría que estar pulsando la tecla antes de llegar a la línea de código que lee el teclado.

Trabajo en windows 10, con python 2.7 y mi IDE es pycharm.

Código:
import msvcrt
import win32com.client
import time

Shell= win32com.client.Dispatch("WScript.Shell")


def funcion1():

    #realiza la función 1

    return

def funcion2():

    #realiza la funcion 2

    return

while True:

    Shell.SendKeys("{F9}")      #tecla que va a estarse pulsando continuamente
    time.sleep(0.5)             #tiempo de espera

    #PARTE DEL CÓDIGO QUE ME FALTA, DONDE LEE EL TECLADO Y SE GUARDA EN "TECLA"
    
        if tecla == 1:
            funcion1()

        elif tecla == 2:
            funcion2()

    #SE REPITE EL PROCESO



Ya lo he intentado con el módulo msvcrt.kbhit() y msvcrt.getch() y creo que no me funciona para lo que quiero, debido a que
se queda en esa parte del código y no vuelve al bucle. además que también me da problema con el IDE y tengo que ejecutar el
código a traves de la consola de python.


gracias por vuestra atención.
Responder
#2
Hola, ¡bienvenido!

El problema es que msvcrt.getch() bloquea la ejecución hasta que se presione alguna tecla. Ya que veo que estás haciendo uso de la API de Windows, te recomiendo que uses una función llamada GetAsyncKeyState para conocer si una tecla está siendo presionada. Es sencillo acceder a ella vía ctypes.

  1. from ctypes import windll
  2.  
  3. VK_A = 0x41 # Tecla 'A'
  4.  
  5. # Dentro del bucle.
  6. if windll.user32.GetAsyncKeyState(VK_A):
  7. # ...


Acá tenés una lista con todas las teclas.

Saludos.
Responder
#3
Efectivamente! esta solución es mucho mejor y funciona perfectamente , Muchísimas gracias!

Podeis cerrar el tema, gracias!
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)