automatisierung von windows-anwendungen

36
Folie 1 Vortrag > 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

Upload: andreas-schreiber

Post on 23-Jan-2015

2.273 views

Category:

Technology


1 download

DESCRIPTION

PyCologne-Vortrag (Köln, 12.08.2009)

TRANSCRIPT

Page 1: Automatisierung von Windows-Anwendungen

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

Page 2: Automatisierung von Windows-Anwendungen

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/*

Page 3: Automatisierung von Windows-Anwendungen

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

Page 4: Automatisierung von Windows-Anwendungen

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(); }

Page 5: Automatisierung von Windows-Anwendungen

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

Page 6: Automatisierung von Windows-Anwendungen

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

Page 7: Automatisierung von Windows-Anwendungen

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"

Page 8: Automatisierung von Windows-Anwendungen

Folie 8Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum

Automatisierung von Applikationen

-Ermittlung der ProgID-Methoden der Applikation

Page 9: Automatisierung von Windows-Anwendungen

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")

Page 10: Automatisierung von Windows-Anwendungen

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

Page 11: Automatisierung von Windows-Anwendungen

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

Page 12: Automatisierung von Windows-Anwendungen

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

Page 13: Automatisierung von Windows-Anwendungen

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

Page 14: Automatisierung von Windows-Anwendungen

Folie 14Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum

Browsen der Schnittstellen mit combrowse

Page 15: Automatisierung von Windows-Anwendungen

Folie 15Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum

Browsen der Schnittstellen mit combrowse

PowerPoint

Page 16: Automatisierung von Windows-Anwendungen

Folie 16Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum

Browsen der Schnittstellen mit combrowse

Slides

Add Slide

Parameter

Page 17: Automatisierung von Windows-Anwendungen

Folie 17Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum

Alternativer BrowserType Library Browser tlbrowse.py

Page 18: Automatisierung von Windows-Anwendungen

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

Page 19: Automatisierung von Windows-Anwendungen

Folie 19Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum

Debugging

Page 20: Automatisierung von Windows-Anwendungen

Folie 20Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum

DebuggingPython Trace Collector

import win32traceutil

Page 21: Automatisierung von Windows-Anwendungen

Folie 21Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum

Grundlegende Automatisierungen-Skripte-Events-Add-Ins

Page 22: Automatisierung von Windows-Anwendungen

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)

Page 23: Automatisierung von Windows-Anwendungen

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

Page 24: Automatisierung von Windows-Anwendungen

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

Page 25: Automatisierung von Windows-Anwendungen

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

Page 26: Automatisierung von Windows-Anwendungen

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

Page 27: Automatisierung von Windows-Anwendungen

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

Page 28: Automatisierung von Windows-Anwendungen

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()

Page 29: Automatisierung von Windows-Anwendungen

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

Page 30: Automatisierung von Windows-Anwendungen

Folie 30Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum

Demos

Page 31: Automatisierung von Windows-Anwendungen

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

Page 32: Automatisierung von Windows-Anwendungen

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)

Page 33: Automatisierung von Windows-Anwendungen

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

Page 34: Automatisierung von Windows-Anwendungen

Folie 34Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum

Quellen und Literatur

Page 35: Automatisierung von Windows-Anwendungen

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/

Page 36: Automatisierung von Windows-Anwendungen

Folie 36Vortrag > Andreas Schreiber> Automatisierung von Windows-Anwendungen mit Python > Datum

LiteraturPython Programming on Win32

Mark Hammond, Andy Robinson:Python Programming on Win32