Folie 1Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Automatisierung von Windows-Anwendungen
Python for Windows
PyCologne (12.08.2009, Köln)Andreas Schreiber <[email protected]>
http://andreas-schreiber.net | http://www.pycologne.de
Folie 2Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Automatisierung von Windows-AnwendungenUm was geht es?
Steuerung und Erweiterung existierender Windows-Applikationen
Applikationen mit COM-Interface
Client-Skripte in Python
Event-Handling
Add-Ins
Weitere Themen (hier nicht behandelt)
System-Programmierung unter Windows
Erstellung von Windows-Services mit Python
GUI-Programmierung
File-Management
Modul win32com
Module win32/*
Folie 3Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
COMComponent Object Model
Plattform-Technologie für Windows
Interprozesskommunikation
Dynamische Objekterzeugung
Client/Server-Architektur
COM-Client instanziert eine
COM-Komponente in einem
COM-Server und nutzt die
Funktionalität des Objektes über
COM-Interfaces
COM-Server ist eine DLL oder ein Executable
Folie 4Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
COMCOM-Interface
COM-Komponente kann dazu über allgemeine Schnittstellen und über spezielle Schnittstellen angesprochen werden.
Jedes Interface hat eine weltweit eindeutige Identifikationsnummer, die GUID (Globally Unique Identifier)
// Standardschnittstelle aller COM-Komponenten [ object, uuid(00000000-0000-0000-C000-000000000046) ] interface IUnknown { [restricted] HRESULT _stdcall QueryInterface([in] GUID* rrid, [out] void** ppvObj); [restricted] unsigned long _stdcall AddRef(); [restricted] unsigned long _stdcall Release(); }
Folie 5Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
COMAutomatisierung und Clients
AutomatisierungDas Steuern von Anwendungen über COM-Interfaces wird als Automatisierung bezeichnet.
ClientsIm selben Prozess durch direkte Funktionsaufrufe
Auf derselben Maschine durch IPC calls
Client ComponentComponent
Client ComponentComponentCOMCOM
Client Process Server Process
Folie 6Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Pywin32Python for Windows extensions
Pywin32
Python-Unterstützung für Windows
Entwickelt von Mark Hammond
http://sourceforge.net/projects/pywin32/
win32com
Python COM Paket
Entwicklung von COM-Clients
Entwicklung vom COM-Servern
Folie 7Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
„Hello World“Microsoft Word
from win32com import client word = client.Dispatch("Word.Application")word.Visible = 1 doc = word.Documents.Add() doc.Content.Text = "Hello World"
Folie 8Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Automatisierung von Applikationen
-Ermittlung der ProgID-Methoden der Applikation
Folie 9Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Ermittlung der ProgID
Notwendig zum Ansprechen (“Dispatch”) der Applikation
Mit Hilfe von WBEM
Schnell, aber unvollständig
Skript: getProgIDsFromWBEM.py http://onyame.pastebin.ca/1522189
Ergebnis: progIDs_partialFromWBEM.txt
Über die Registry
Vollständig, aber sehr langsam
Skript: getProgIDsFromRegistry.py http://onyame.pastebin.ca/1522193
Ergebnis:
from win32com.client import Dispatch excel = Dispatch(„Excel.Application")
Folie 10Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Beispiele für ProgIDs
Access.Application
Citrix.ICAClient
Excel.Application
MSProject.Application
PowerPoint.Application
Visio.Application
Word.Application
Folie 11Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Methoden der Applikation
COM Dokumentation der Applikationen
Manchmal schwer zu finden
Generierung eines Python-Moduls mit makepy
/Python25/Lib/site-packages/win32com/client/makepy.py
Vorteile im Editor (Eingebeerweiterung)
Etwas schneller
Browsen der Schnittstellen mit combrowse
/Python25/Lib/site-packages/win32com/client/combrowse.py
Folie 12Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Generierung eines Python-Moduls mit makepy
Beispiel PowerPoint
91493440-5A91-11CF-8700-00AA0060263Bx0x2x8.py
Folie 13Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Generierung eines Python-Moduls mit makepyBeispiel-Ausschnitt: PowerPoint Slides Add
class Slides(DispatchBaseClass): CLSID = IID('{91493469-5A91-11CF-8700-00AA0060263B}') coclass_clsid = None
# Result is of type Slide def Add(self, Index=defaultNamedNotOptArg, Layout=defaultNamedNotOptArg): ret = self._oleobj_.InvokeTypes(2004, LCID, 1, (13, 0), ((3, 1), (3, 1)),Index , Layout) if ret is not None: # See if this IUnknown is really an IDispatch try: ret = ret.QueryInterface(pythoncom.IID_IDispatch) except pythoncom.error: return ret ret = Dispatch(ret, 'Add', '{91493445-5A91-11CF-8700-00AA0060263B}', UnicodeToString=0) return ret
Folie 14Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Browsen der Schnittstellen mit combrowse
Folie 15Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Browsen der Schnittstellen mit combrowse
PowerPoint
Folie 16Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Browsen der Schnittstellen mit combrowse
Slides
Add Slide
Parameter
Folie 17Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Alternativer BrowserType Library Browser tlbrowse.py
Folie 18Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Beispiel
from win32com import client ppt = client.Dispatch(„Powerpoint.Application")ppt.Visible = 1 ppt.ActivePresentation.Slides.Add(1,1)
Index Layout
Folie 19Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Debugging
Folie 20Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
DebuggingPython Trace Collector
import win32traceutil
Folie 21Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Grundlegende Automatisierungen-Skripte-Events-Add-Ins
Folie 22Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Events
Event-Abarbeitung
Event-Handler definieren
Applikation mit Event-Handler anfordern („Dispatch“)
Event-Schleife: Auf Events warten
Mögliche Events
Window-Eigenschaften („Resize“ etc.)
Document-Eigenschaften („Zellen-Inhalte“ etc.)
Buttons (z.B. in Toolbars)
Folie 23Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
EventsEvent-Handler definieren
Beispiel Excel
Beispiel PowerPoint
class EventManager(object): def OnSheetBeforeDoubleClick(self, sheet, target, cancel): print „Do something“ # something pass
class EventManager(object): def OnSlideShowNextSlide(self, Wn): print „Do something“ # something pass
Folie 24Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
EventsWelche Events gibt es? – Beispiel Excel
Aus 00020813-0000-0000-C000-000000000046.py
OnGetTypeInfoOnWorkbookAddinInstallOnSheetBeforeRightClickOnSheetFollowHyperlinkOnWorkbookBeforePrintOnWorkbookBeforeXmlExportOnWorkbookDeactivate OnSheetSelectionChangeOnInvokeOnSheetActivateOnWorkbookAddinUninstallOnAddRefOnQueryInterfaceOnWorkbookSyncOnSheetChangeOnGetTypeInfoCountOnWorkbookBeforeSaveOnWorkbookAfterXmlExport
OnWorkbookPivotTableCloseConnectionOnSheetCalculateOnWorkbookPivotTableOpenConnectionOnSheetBeforeDoubleClickOnSheetDeactivateOnWindowDeactivateOnReleaseOnWindowResizeOnSheetPivotTableUpdateOnWorkbookOpenOnWorkbookBeforeXmlImportOnWindowActivateOnNewWorkbookOnWorkbookNewSheetOnWorkbookAfterXmlImportOnWorkbookBeforeCloseOnGetIDsOfNames
Folie 25Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
EventsWelche Events gibt es? – Beispiel PowerPoint
Aus 91493440-5A91-11CF-8700-00AA0060263B.py
OnPresentationBeforeSaveOnColorSchemeChangedOnSlideShowNextSlideOnSlideShowNextClickOnPresentationOpenOnPresentationSaveOnWindowBeforeRightClickOnSlideShowBeginOnWindowBeforeDoubleClickOnWindowSelectionChangeOnNewPresentation
OnWindowDeactivateOnPresentationCloseOnAfterPresentationOpenOnAfterNewPresentationOnSlideShowNextBuildOnPresentationNewSlideOnPresentationSyncOnSlideSelectionChangedOnWindowActivateOnSlideShowEndOnPresentationPrint
Folie 26Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
EventsApplikation mit Event-Handler anfordern („Dispatch“)
# Dispatch Excel with event handlerfrom win32com.client import DispatchWithEventsexcel = DispatchWithEvents('Excel.Application', EventManager)excel.Visible = 1
Folie 27Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
EventsEvent-Schleife: Auf Events warten
# Listen for eventsimport threading, pythoncomstopEvent = threading.Event()while True: pythoncom.PumpWaitingMessages() # Necessary so that python doesn't hog CPU stopEvent.wait(.2) if stopEvent.isSet(): stopEvent.clear() break
Folie 28Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Add-Ins
Erstellen von Add-Ins
Ermitteln einer CLSID für das Add-In
Cut & Paste der Add-In Klassendefinition
Überschreiben von Methoden der Add-In Klasse
Registrieren des Add-Ins
import pywintypesclsid = pywintypes.CreateGuid()
Folie 29Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Add-InsKlasse Addin
class Addin(object): _com_interfaces_ = ['_IDTExtensibility2'] _public_methods_ = [] _reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER _reg_clsid_ = '{2F1E606F-2A7B-46F9-AF6A-267C0036C348}' _reg_progid_ = 'Python.Test.Addin' _reg_policy_spec_ = 'win32com.server.policy.EventHandlerPolicy' def __init__(self): import win32traceutil; self.application = None
def OnConnection(self, application, connectMode, addin, custom): print 'OnConnection', application, connectMode, addin, custom def OnDisconnection(self, mode, custom): print 'OnDisconnection'‚ mode, custom def OnAddInsUpdate(self, custom): print 'OnAddInsUpdate', custom def OnStartupComplete(self, custom): print 'OnStartupComplete', custom def OnBeginShutdown(self, custom): print 'OnBeginShutdown', custom
Folie 30Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Demos
Folie 31Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
DemoTwitter in PowerPoint
Twitter message on every PowerPoint OnSlideShowNextSlide event
The speaker note will be the message, if existing
python-twitterpython-twitter
Folie 32Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Twitter in PowerPointImplementation using Python’s win32com (1)
Event handler for PowerPoint
import twitterapi = twitter.Api(username='python_demo', password='*')
class EventManager(object):
def OnSlideShowNextSlide(self, Wn): i = powerpoint.ActivePresentation. SlideShowWindow.View.Slide.SlideIndex for shape in powerpoint.ActivePresentation. Slides[i-1].NotesPage.Shapes: if shape.TextFrame.HasText: notes = shape.TextFrame.TextRange.Text api.PostUpdate(notes)
Folie 33Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Twitter in PowerPointImplementation using Python’s win32com (2)
Dispatch PowerPoint with event handler and listen for events
from win32com.client import DispatchWithEventspowerpoint = DispatchWithEvents('PowerPoint.Application', EventManager)powerpoint.Visible = 1
# Listen for eventsimport threading, pythoncomstopEvent = threading.Event()while True: pythoncom.PumpWaitingMessages() stopEvent.wait(.2) if stopEvent.isSet(): stopEvent.clear() break
Source: Roy Han’s PyCon 2008 tutorial “Automating Windows Applications with win32com” http://tr.im/q43o
Folie 34Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Quellen und Literatur
Folie 35Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
Quellen
Tutorial Automating Windows Applications with win32com
Roy H. Han, Python Conference 2008, Chicago
http://us.pycon.org/2008/tutorials/AutomatingWindows/
Website Python for Windows – Ressources and examples
Mustafa Görmezer
http://win32com.goermezer.de/
Folie 36Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum
LiteraturPython Programming on Win32
Mark Hammond, Andy Robinson:Python Programming on Win32