2009-08-07 18 views
7

Estoy intentando hacer una aplicación de muestra en python que utiliza algunos objetos COM. He leído el famoso capítulo 12 de Python Programación en Win32, pero con respecto a este tema que sólo los Estados:Consumir eventos COM en Python

manejo

Todo evento se realiza mediante IConnectionPoint las interfaces normales, y aunque más allá del alcance de este libro , es totalmente compatible con el marco COM Python estándar .

¿Alguien puede arrojar algo de luz sobre esto? Necesitaría una simple muestra inicial. Algo así como la adición de código para esta muestra para capturar el evento AlActivar de la hoja de cálculo

import win32com.client 
xl = win32com.client.Dispatch("Excel.Application") 
... 

Respuesta

6

no he automatizado Excel, pero estoy usando un código de Speech API de Microsoft que puede ser lo suficientemente similares como para que pueda empezar:

ListenerBase = win32com.client.getevents("SAPI.SpInProcRecoContext") 
class Listener(ListenerBase): 
    def OnRecognition(self, _1, _2, _3, Result): 
     """Callback whenever something is recognized.""" 
     # Work with Result 

    def OnHypothesis(self, _1, _2, Result): 
     """Callback whenever we have a potential match.""" 
     # Work with Result 

luego en un bucle principal:

while not self.shutting_down.is_set(): 
     # Trigger the event handlers if we have anything. 
     pythoncom.PumpWaitingMessages() 
     time.sleep(0.1) # Don't use up all our CPU checking constantly 

Editar para más detalle en el bucle principal:

Cuando sucede algo, la devolución de llamada no se llama inmediatamente; en su lugar, debe llamar a PumpWaitingMessages(), que verifica si hay eventos esperando y luego llama a la devolución de llamada correspondiente.

Si desea hacer otra cosa mientras esto sucede, deberá ejecutar el ciclo en una secuencia separada (consulte el módulo de subprocesamiento); de lo contrario, puede simplemente sentarse en la parte inferior de su script. En mi ejemplo, lo estaba ejecutando en un hilo separado porque también tenía una GUI en ejecución; la variable shutting_down es un Threading. Evento que puede usar para indicarle al thread de bucle que se detenga.

+0

Gracias por esto. ¿Puedes detallar un poco la 2da parte (el ciclo)? ¡Lamento molestar! Estoy empezando de nuevo en pyhton :). –

+0

No hay problema, ver mi edición :) – Kiv

+0

:) Sé lo que es el ciclo del mensaje - no puedo encontrar pythoncom - ¿Es ese un paquete que necesito importar? También veo que también hay un método DispatchWithEvents, lo investigaré cuando tenga tiempo para este problema. –

Cuestiones relacionadas