2009-08-07 14 views
7

Próbuję zrobić przykładową aplikację w python, który używa niektórych obiektów COM. Czytałem słynny rozdział 12 od Python Programowanie na Win32 ale dotyczące tego zagadnienia to tylko mówi:Zużywanie zdarzeń COM w języku Python

obsługa

Wszystko wydarzenie odbywa się za pomocą normalne IConnectionPoint interfejsy i chociaż poza zakresem niniejszego książce, jest w pełni obsługiwany przez standardową architekturę Python w standardzie .

Czy ktoś może rzucić trochę światła na to? Potrzebowałbym prostej próbki początkowej. Coś jak dodanie kodu do tej próbki złapać OnActivate zdarzenie na arkuszu

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

Odpowiedz

6

Nie zautomatyzowanego Excel, ale używam jakiś kod z Microsoftu Speech API, które mogą być na tyle podobne, aby zacząć:

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 

potem w głównej pętli:

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 

Edit dla bardziej szczegółowo na głównej pętli:

Gdy coś się stanie, wywołanie zwrotne nie zostanie natychmiast wywołane; zamiast tego musisz wywołać funkcję PumpWaitingMessages(), która sprawdza, czy są jakieś zdarzenia oczekujące, a następnie wywołuje odpowiednie wywołanie zwrotne.

Jeśli chcesz zrobić coś innego, gdy tak się dzieje, musisz uruchomić pętlę w osobnym wątku (patrz moduł wątków); w przeciwnym razie może po prostu usiąść na samym dole skryptu. W moim przykładzie uruchomiłem go w osobnym wątku, ponieważ miałem również uruchomiony GUI; zmienna shutting_down to threading.Event, której możesz użyć do poinformowania zapętlonego wątku o zatrzymaniu.

+0

Dzięki za to. Czy możesz szczegółowo opisać drugą część (pętla) - przepraszam, że przeszkadzam, że zaczynam od nowa na pyhtonie :). –

+0

Nie ma problemu, zobacz moją edycję :) – Kiv

+0

:) Wiem, czym jest pętla wiadomości - nie mogę znaleźć pythoncom - czy pakiet muszę zaimportować? Widzę też, że istnieje również metoda DispatchWithEvents - zajrzę w to, gdy dostanę czas na ten problem. –