7

いくつかの COM オブジェクトを使用するサンプル アプリを Python で実行しようとしています。Win32 での Python プログラミングの有名な第 12 章を読みましたが、この問題に関しては次のようにしか述べていません。

すべてのイベント処理は通常のIConnectionPointインターフェイスを使用して行われ、この本の範囲を超えていますが、標準の Python COM フレームワークによって完全にサポートされています。

誰でもこれに光を当てることができますか?簡単なスターターサンプルが必要です。このサンプルにコードを追加して、スプレッドシートの OnActivate イベントをキャッチするようなもの

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

1 に答える 1

6

私はExcelを自動化していませんが、MicrosoftのSpeech APIのコードを使用しています。これらのコードは、使い始めるのに十分似ている可能性があります。

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

その後、メインループで:

    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

メインループの詳細については、編集してください。

何かが起こっても、コールバックはすぐには呼び出されません。代わりに、PumpWaitingMessages()を呼び出す必要があります。これは、待機中のイベントがあるかどうかを確認してから、適切なコールバックを呼び出します。

これが発生している間に何か他のことをしたい場合は、別のスレッドでループを実行する必要があります(スレッドモジュールを参照)。それ以外の場合は、スクリプトの下部に配置できます。私の例では、GUIも実行していたため、別のスレッドで実行していました。shutting_down変数はthreading.Eventであり、ループしているスレッドに停止するように指示するために使用できます。

于 2009-08-07T12:46:03.830 に答える