2009-08-07 21 views
7

Sto provando a fare un'app di esempio in python che utilizza alcuni oggetti COM. Ho letto il famoso capitolo 12 da Python Programmazione su Win32, ma riguardo a questo problema si afferma solo:Consumare eventi COM in Python

movimentazione

Tutti evento viene fatto utilizzando normali IConnectionPoint interfacce, e anche se al di là della portata di questo libro , è completamente supportato dal framework COM Python standard .

Qualcuno può far luce su questo? Avrei bisogno di un semplice campione di avviamento. Qualcosa come l'aggiunta di codice per questo esempio per catturare l'evento OnActivate per il foglio di calcolo

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

risposta

6

non ho automatizzato di Excel, ma sto usando un certo codice da Speech API di Microsoft che potrebbe essere abbastanza simili per iniziare:

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 

poi in un ciclo principale:

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 

Modifica per maggiori dettagli sul ciclo principale:

Quando succede qualcosa, il callback non viene chiamato immediatamente; devi invece chiamare PumpWaitingMessages(), che controlla se ci sono eventi in attesa e quindi chiama il callback appropriato.

Se si desidera eseguire qualcos'altro mentre ciò accade, è necessario eseguire il ciclo in un thread separato (consultare il modulo di threading); altrimenti si può semplicemente sedere in fondo al tuo copione. Nel mio esempio lo stavo eseguendo in un thread separato perché avevo anche una GUI in esecuzione; la variabile shutting_down è un threading.Event che puoi usare per dire al thread in loop di fermarsi.

+0

Grazie per questo. Potete dettagliare un po 'la seconda parte (il ciclo) - mi dispiace disturbare sto iniziando a lavorare su pyhton :). –

+0

Nessun problema, vedere la mia modifica :) – Kiv

+0

:) So qual è il ciclo del messaggio - non riesco a trovare pythoncom - è un pacchetto che devo importare? Anche io vedo che c'è anche un metodo DispatchWithEvents - cercherò di approfondire quando avrò tempo per questo problema. –