Windows-(GUI-)Programme mit Python fernsteuern

von sparrow242

Wo wir schon gerade bei Python und Fernsteuerungen waren:

Es gibt ja immer mal wieder Anbieter von Softwareprodukten denen kann man einfach keine Schnittstelle für kleines Geld abschwatzen. Noch Schwieriger wird es wenn man über diese Schnittstelle nicht nur lesen sondern auch schreiben will. Da bekommen ganz, ganz viele Hersteller Bauchschmerzen und fangen mit so komischen Geschichten an wie „keine Haftung“ und „Garantieverlust“.
Hallo? Ich will eine Schnittstelle? Baut die gefälligst so robust, dass ich damit gar nichts kaputt machen kann…

Glücklicherweise haben die meisten Programme eh eine Schnittstelle, nämlich die über die der Benutzer mit ihr interagiert. Die müsste man nur vernünftig mit einem Programm benutzen können. Da kann sich der Anbieter wohl kaum mit „Haftungsausschluss“ heraus reden.

Zumindest unter Windows habe ich da mit Python eine ziemlich gute Lösung gefunden: pywinauto!

Vergleichbares gibt es sicherlich auch für andere Betriebssysteme, ich brauchte es aber für eine Anwendung die unter Windows läuft. Die Benutzung ist unglaublich einfach und eingängig. Nach 10 Minuten Einarbeitung ist das ganze geflutscht.
Offensichtlich kommt pywinauto auch mit relativ exotischen Toolkits zurecht, zumindest bei der Anwendung für das ich das Programm brauchte hatte ich überhaupt kein Problem, und das ist irendwas verwegen altes.

Um das noch einmal zu erklären: wir reden hier davon einen Benutzer an einem System zu „simulieren“ indem wir Programmen Tastendrücke, Mausklicks, etc. schicken. Und das auf eine einfache Weise.

Ein kleiner Beispielcode:

from pywinauto import application

app = application.Application()  # Applikationskontext erzeugen
app.start_("notepad.exe")  # Externes Programm starten
app.notepad.TypeKeys("Hallo Welt", with_spaces = True) # Etwas tippen
app.notepad.TypeKeys("{ENTER}Ich kann hier automatisch Ticken",
                     with_spaces = True)  # Noch mehr tippen
bs = "{BACKSPACE}" * 4
app.notepad.TypeKeys(bs + "ppen")  # Vertipper entfernen
app.notepad.MenuSelect("?->Info")  # Info aus dem Menü aufrufen
app.infoubereditor.OK.Click()  # Im Info-Dialog OK klicken
app.notepad.MenuSelect("Datei->Beenden")  # Über das Menü notepad beenden
app.editor.Nein.Click()  # Nein, wir möchten nicht speichern

Hat ein bisschen gedauert bis ich darauf gekommen bin, dass Spezialtasten in geschweifte Klammern geschrieben werden. {ENTER}, {BACKSPACE} aber auch {F1}, etc, verhalten sich wie erwartet.

Hab ich schon erwähnt, dass ich es mag wenn es flutscht?

— der Würschtlmann

Advertisements