| \chapter{MacPython OSA Modules \label{scripting}} |
| |
| This chapter describes the current implementation of the Open Scripting |
| Architecure (OSA, also commonly referred to as AppleScript) for Python, allowing |
| you to control scriptable applications from your Python program, |
| and with a fairly pythonic interface. Development on this set of modules |
| has stopped, and a replacement is expected for Python 2.5. |
| |
| For a description of the various components of AppleScript and OSA, and |
| to get an understanding of the architecture and terminology, you should |
| read Apple's documentation. The "Applescript Language Guide" explains |
| the conceptual model and the terminology, and documents the standard |
| suite. The "Open Scripting Architecture" document explains how to use |
| OSA from an application programmers point of view. In the Apple Help |
| Viewer these book sare located in the Developer Documentation, Core |
| Technologies section. |
| |
| |
| As an example of scripting an application, the following piece of |
| AppleScript will get the name of the frontmost \program{Finder} window |
| and print it: |
| |
| \begin{verbatim} |
| tell application "Finder" |
| get name of window 1 |
| end tell |
| \end{verbatim} |
| |
| In Python, the following code fragment will do the same: |
| |
| \begin{verbatim} |
| import Finder |
| |
| f = Finder.Finder() |
| print f.get(f.window(1).name) |
| \end{verbatim} |
| |
| As distributed the Python library includes packages that implement the |
| standard suites, plus packages that interface to a small number of |
| common applications. |
| |
| To send AppleEvents to an application you must first create the Python |
| package interfacing to the terminology of the application (what |
| \program{Script Editor} calls the "Dictionary"). This can be done from |
| within the \program{PythonIDE} or by running the |
| \file{gensuitemodule.py} module as a standalone program from the command |
| line. |
| |
| The generated output is a package with a number of modules, one for |
| every suite used in the program plus an \module{__init__} module to glue |
| it all together. The Python inheritance graph follows the AppleScript |
| inheritance graph, so if a programs dictionary specifies that it |
| includes support for the Standard Suite, but extends one or two verbs |
| with extra arguments then the output suite will contain a module |
| \module{Standard_Suite} that imports and re-exports everything from |
| \module{StdSuites.Standard_Suite} but overrides the methods that have |
| extra functionality. The output of \module{gensuitemodule} is pretty |
| readable, and contains the documentation that was in the original |
| AppleScript dictionary in Python docstrings, so reading it is a good |
| source of documentation. |
| |
| The output package implements a main class with the same name as the |
| package which contains all the AppleScript verbs as methods, with the |
| direct object as the first argument and all optional parameters as |
| keyword arguments. AppleScript classes are also implemented as Python |
| classes, as are comparisons and all the other thingies. |
| |
| The main |
| Python class implementing the verbs also allows access to the properties |
| and elements declared in the AppleScript class "application". In the |
| current release that is as far as the object orientation goes, so |
| in the example above we need to use |
| \code{f.get(f.window(1).name)} instead of the more Pythonic |
| \code{f.window(1).name.get()}. |
| |
| |
| If an AppleScript identifier is not a Python identifier the name is |
| mangled according to a small number of rules: |
| \begin{itemize} |
| \item spaces are replaced with underscores |
| \item other non-alphanumeric characters are replaced with |
| \code{_xx_} where \code{xx} is the hexadecimal character value |
| \item any Python reserved word gets an underscore appended |
| \end{itemize} |
| |
| Python also has support for creating scriptable applications |
| in Python, but |
| The following modules are relevant to MacPython AppleScript support: |
| |
| \localmoduletable |
| |
| In addition, support modules have been pre-generated for |
| \module{Finder}, \module{Terminal}, \module{Explorer}, |
| \module{Netscape}, \module{CodeWarrior}, \module{SystemEvents} and |
| \module{StdSuites}. |
| |
| \input{libgensuitemodule} |
| \input{libaetools} |
| \input{libaepack} |
| \input{libaetypes} |
| \input{libminiae} |