este es mi guión
import pyHook import pythoncom hookManager = pyHook.HookManager() def onKeyboardEvent(event): if event.KeyID == 113: # F2 #do something# return True hookManager.KeyDown = onKeyboardEvent hookManager.HookKeyboard() pythoncom.PumpMessages()
después de presionar la tecla especificada en el evento del teclado, o la tecla F2 como mi script, varias veces, el script deja de funcionar …
Alguien sabe por qué? ¿O cómo resolverlo?
Tengo que reiniciar el script cada vez que esto sucede, y tengo que presionar mucho la tecla en mi script …
Tal vez pueda llamar a la función como un subproceso para ejecutarse de forma asíncrona, agregarlos a su propia cola o establecer una condición para que no se ejecute si ya se está ejecutando, eso dejará de llenar el mensaje de volcado, que es el que está fallando.
Opción 1. Esto agregará la ejecución de la función a la cola de hilos:
importar pythoncom, pyHook, threading lock = threading.Lock () def myFunc (i): lock.acquire () #execute la siguiente función hasta que finalice la anterior # algún código Lock.release () def OnKeyboardEvent (evento): keyPressed = chr (event.Ascii) si keyPressed == 'z': t = threading.Thread (target = myFunc, args = (1,)) #added a la cola t.start () volver verdadero hm = pyHook.HookManager () hm.KeyDown = OnKeyboardEvent hm.HookKeyboard () pythoncom.PumpMessages ()
Opción 2. o esto ignorará otras llamadas de procesamiento si está ocupado:
def myFunc (i): myFunc.isRunning = True # algún código myFunc.isRunning = False myFunc.isRunning = False def OnKeyboardEvent (evento): keyPressed = chr (event.Ascii) si keyPressed == 'z': si no es myFunc.isRunning: la función #if se está ejecutando ignora esta llamada t = threading.Thread (target = myFunc, args = (1,)) t.start () volver verdadero
por supuesto, debe tener cuidado al agregar código al capturar excepciones o el hilo permanecerá bloqueado.