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.

tip

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

warning

XSCRIPTCONTEXT wird importierten Modulen nicht zur Verfügung gestellt.


LibreOffice Basic-Bibliotheken 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 (Benutzerprofil)/Scripts/python/pythonpath gespeichert werden. Python-Bibliotheken 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()

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
        

Bitte unterstützen Sie uns!