Inhalte

# Programmierung mit Python-Skripten

Ein Python-Makro ist eine Funktion in einer .py-Datei, die als Modul identifiziert wird. Im Gegensatz zu LibreOffice Basic und seinem Dutzend Funktionen oder Dienste von UNO-Objekten verwenden Python-Makros das UNO-Einzelobjekt XSCRIPTCONTEXT, gemeinsam mit JavaScript und BeanShell. Das globale Tupel g_exportedScripts listet explizit auswählbare Makros aus einem Modul auf. Python-Module verfügen über eine autonome Codelogik und sind voneinander unabhängig.

## Globale Variable XSCRIPTCONTEXT

Echte grundlegende UNO-Funktionen können aus der globalen Variablen XSCRIPTCONTEXT abgeleitet werden. In der LibreOffice-API finden Sie eine vollständige Beschreibung von XSCRIPTCONTEXT. XSCRIPTCONTEXT-Methoden zusammengefasst sind:

Methoden | Beschreibung | In Basic als zugeordnet
--- | --- | ---
getDocument() | Die Dokumentreferenz, mit der das Skript arbeiten kann. | ThisComponent
getDesktop() | Die Desktop-Referenz, auf der das Skript ausgeführt werden kann. | StarDesktop
getComponentContext() | Der Komponentenkontext, mit dem das Skript andere Uno-Komponenten erstellen kann. | GetDefaultContext

Die gemeinsam genutzten Installationsskripte HelloWorld und Capitalize veranschaulichen UNO-bezogene Makros, welche die globale Variable XSCRIPTCONTEXT verwenden.

Die Python-Standardausgabedatei ist nicht verfügbar, wenn Python-Makros über Extras – Makros – Makro ausführen… gestartet werden. Weitere Informationen finden Sie unter Eingabe / Ausgabe auf dem Bildschirm.

## Modulimport

XSCRIPTCONTEXT wird importierten Modulen nicht zur Verfügung gestellt.

Bibliotheken für LibreOffice Basic enthalten Klassen, Routinen und Variablen, Python-Module enthalten Klassen, Funktionen und Variablen. Allgemeine Teile wiederverwendbarer Python- oder UNO-Funktionen müssen in Meine Makros in (Anwenderprofil)/Scripts/python/pythonpath gespeichert werden. Bibliotheken für Python helfen beim Organisieren von Modulen, um Kollisionen von Modulnamen zu verhindern. Importieren Sie uno.py in gemeinsam genutzte Module.

Echte BASIC UNO-Einrichtungen können mithilfe des Moduls uno.py abgeleitet werden. Lesen Sie Interaktive Python-Shell, um eine vollständige Modulbeschreibung mit den Python-Befehlen dir() und help() zu erhalten.

Funktionen | Beschreibung | In Basic zugeordnet als
--- | --- | ---
absolutize() | Gibt eine absolute Datei-URL von den angegebenen URLs zurück. |
createUnoStruct() | Erstellt eine UNO-Struktur oder -Ausnahme, die durch typeName angegeben wird. | CreateUNOStruct()
fileUrlToSystemPath() | Gibt einen Systempfad zurück. | ConvertFromURL()
getClass() | Gibt die Klasse einer konkreten UNO-Ausnahme, -Struktur oder -Schnittstelle zurück. |
getComponentContext() | Gibt den UNO-Komponentenkontext zurück, der zum Initialisieren der Python-Laufzeit verwendet wird. | GetDefaultContext()
Enum() getConstantByName() | Sucht den Wert einer IDL-Konstante anhand ihres expliziten Namens. | Siehe API-Konstantengruppen
isInterface() | Gibt True zurück, wenn obj eine Klasse einer UNO-Schnittstelle ist. |
systemPathToFileUrl() | Gibt eine Datei-URL für den angegebenen Systempfad zurück. | ConvertToURL()

Die vorinstallierten Skripte LibreLogo, NamedRanges, SetCellColor und TableSample verwenden das Modul uno.py.

## Weitere Python-Basic-Beispiele

Python UNO | Basic UNO-Funktionen
--- | ---
ctx = uno.getComponentContext() smgr = ctx.getServiceManager() obj = smgr.createInstanceWithContext( .. , ctx) | CreateUnoService()
Siehe Einen Dialog öffnen | CreateUnoDialog()
Siehe Einen Listener erstellen | CreateUnoListener()
Siehe UNO-Datentypen | CreateUnoValue() CreateObject()
Vergleichsoperatoren "==" oder "!=" verwenden | EqualUnoObjects()
ctx = uno.getComponentContext() smgr = ctx.getServiceManager() | GetProcessServiceManager()
def hasUnoInterfaces(obj, *interfaces): return set(interfaces).issubset(t.typeName for t in obj.Types) | HasUnoInterfaces()
| IsUnoStruct()
ctx = uno.getComponentContext() smgr = ctx.getServiceManager() DESK = 'com.sun.star.frame.Desktop' desktop = smgr.createInstanceWithContext(DESK , ctx) | StarDesktop
desktop = smgr.createInstanceWithContext(DESK , ctx) doc = desktop.CurrentComponent | ThisComponent

## Importieren eines eingebetteten Moduls

Ebenso wie LibreOffice-Basic das Durchsuchen und dynamische Laden von Bibliotheken unterstützt, können auch Python-Bibliotheken durchforscht und auf Anfrage importiert werden. Für mehr Informationen über Bibliothekscontainer besuchen Sie LibreOffice Application Programming Interface (API) oder laden Sie das LibreOffice Software Development Kit (SDK) herunter.

Das Importieren eines eingebetteten Moduls für ein Python-Dokument wird unten veranschaulicht, die Ausnahmebehandlung wird nicht detailliert beschrieben:

                import uno, sys, zipimport

                def load_library(library_name: str, module_name=None):
                    """ Bibliothek laden und Modul importieren

                    Adaptiert aus 'Bibliothèque de fonctions' von Hubert Lambert
                    unter https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213"""
                    doc = XSCRIPTCONTEXT.getDocument()  # aktuelles Dokument
                    url = uno.fileUrlToSystemPath( \
                        '{}/{}'.format(doc.URL, 'Scripts/python'+library_name))  # ConvertToURL()
                    if not url in sys.path: # Falls nötig, Pfad hinzufügen
                        sys.path.insert(0, url)  # doclib hat Vorrang
                    if module_name:  # auf Anfrage importieren
                        return zipimport.zipimporter(url).load_module(module_name)

                def import_embedded_python():
                    ui = load_library("my_gui",'screen_io')  # Pfad <lib> hinzufügen + <module> importieren
                    ui.MsgBox(sys.modules.keys())

                g_exportedScripts = (import_embedded_python,)  # Public macros

Verwandte Themen

Grundlegende UNO-Objekte, -Funktionen und -Dienste

Importieren von Python-Modulen

Ein-/Ausgabe auf dem Bildschirm

LibreOffice Python-Skripte Hilfe