2009-08-07 4 views
7

J'essaye de faire un exemple d'application en python qui utilise des objets COM. J'ai lu le fameux chapitre 12 de Python Programing sur Win32, mais en ce qui concerne cette question, il ne dispose que:Consommer des événements COM en Python

Toute manipulation d'événements est effectuée à l'aide IConnectionPoint normales interfaces, et bien au-delà de la portée de ce livre , est entièrement pris en charge par le framework Python COM standard .

Quelqu'un peut-il nous éclairer à ce sujet? J'aurais besoin d'un simple échantillon de départ. Quelque chose comme l'ajout de code à cet exemple pour attraper l'événement OnActivate pour la feuille de calcul

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

Répondre

6

Je n'ai pas Excel automatisé, mais je suis en utilisant un code de Speech API de Microsoft qui peut être assez similaire pour vous aider à démarrer:

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 

plus tard dans une boucle 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 

Modifier pour plus de détails sur la boucle principale:

Lorsque quelque chose se produit, le rappel n'est pas appelé immédiatement; à la place, vous devez appeler PumpWaitingMessages(), qui vérifie s'il y a des événements en attente, puis appelle le rappel approprié.

Si vous voulez faire quelque chose d'autre pendant que cela se produit, vous devrez exécuter la boucle dans un thread séparé (voir le module de thread); Sinon, il peut simplement s'asseoir au bas de votre script. Dans mon exemple, je l'ai exécuté dans un thread séparé parce que j'avais aussi une interface graphique en cours d'exécution; la variable shutting_down est un threading.Event que vous pouvez utiliser pour indiquer au thread en boucle d'arrêter.

+0

Merci pour votre inscription. Pouvez-vous détailler un peu la 2ème partie (la boucle) - désolé de déranger je commence frais sur pyhton :). –

+0

Pas de problème, voir mon edit :) – Kiv

+0

:) Je sais ce que la boucle de message est - je n'arrive pas à trouver pythoncom - est-ce un paquet que j'ai besoin d'importer? Aussi, je vois qu'il y a aussi une méthode DispatchWithEvents - je vais y jeter un coup d'œil quand j'aurai du temps pour ce problème. –

Questions connexes