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 Installationsskripts 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 gemeinsam genutzten Installationsskripte LibreLogo 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

Ähnlich wie LibreOffice Basic, welches das Durchsuchen und dynamische Laden von Bibliotheken unterstützt, können Python-Bibliotheken bei Bedarf durchsucht und importiert werden. Weitere Informationen zu Bibliothekscontainern finden Sie unter LibreOffice Application Programming Interface (API) oder laden Sie sich das LibreOffice Software Development Kit (SDK) herunter.

Das Importieren eines eingebetteten Python-Dokumentmoduls ist unten dargestellt. Die Ausnahmebehandlung wird nicht detailliert beschrieben:


            import uno, sys
            
            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!