Programmieren mit Python-Skripten

Ein Python-Makro ist eine Funktion in einer .py-Datei, die als Modul identifiziert wird. Im Gegensatz zu LibreOffice Basic und seinen Dutzenden UNO-Objektfunktionen oder -diensten verwenden Python-Makros das XSCRIPTCONTEXT UNO-Einzelobjekt, das mit JavaScript und BeanShell gemeinsam genutzt wird. Das globale Tupel g_exportedScripts listet explizit auswählbare Makros aus einem Modul auf. Python-Module enthalten autonome Codelogik und sind voneinander unabhängig.

Globale Variable XSCRIPTCONTEXT

Echte grundlegende UNO-Funktionen können aus der globalen Variablen XSCRIPTCONTEXT abgeleitet werden. Unter LibreOffice API finden Sie eine vollständige Beschreibung von XSCRIPTCONTEXT (englisch). XSCRIPTCONTEXT-Methoden fassen Folgendes zusammen:

Methoden

Beschreibung

Abgebildet in Basic als

getDocument()

Die Dokumentreferenz, auf die das Skript angewendet werden kann.

ThisComponent

getDesktop()

Die Desktop-Referenz, auf die das Skript angewendet werden kann.

StarDesktop

getComponentContext()

Der Komponentenkontext, den das Skript zum Erstellen anderer Uno-Komponenten verwenden kann.

GetDefaultContext


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

tip

Die Python-Standardausgabedatei ist nicht verfügbar, wenn Python-Makros über Extras - Makros - Makro ausführen... ausgeführt werden. Weitere Informationen finden Sie unter Ein-/Ausgabe auf Bildschirm.


Modulimport

warning

XSCRIPTCONTEXT wird für importierte Module nicht bereitgestellt.


LibreOffice Basisbibliotheken enthalten Klassen, Routinen und Variablen, Python-Module enthalten Klassen, Funktionen und Variablen. Gängige wiederverwendbare Python- oder UNO-Features müssen in Meine Makros unter (Benutzerprofil)/Scripts/python/pythonpath gespeichert werden. Python-Bibliotheken helfen beim Organisieren von Modulen, um Kollisionen von Modulnamen zu vermeiden. Importieren Sie uno.py in gemeinsam genutzte Module.

Mit dem Modul uno.py kann auf echte BASIC UNO-Funktionen geschlossen werden. Verwenden Sie die interaktive Python-Shell, um mithilfe der Python-Befehle dir() und help() eine vollständige Modulbeschreibung abzurufen.

Funktionen

Beschreibung

Abgebildet in Basic als

absolutize()

Gibt eine absolute Datei-URL für die angegebenen URLs zurück.

createUnoStruct()

Erstellt eine UNO-Struktur oder eine Ausnahme, die von 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, indem der explizite Name angegeben wird.

Siehe API-Konstantengruppen

isInterface()

Gibt True zurück, wenn Objekt eine Klasse einer UNO-Schnittstelle ist.

systemPathToFileUrl()

Gibt eine Datei-URL für den angegebenen Systempfad zurück.

ConvertToURL()


Die gemeinsam genutzten Skripte LibreLogo und TableSample verwenden das Modul uno.py.

Weitere Beispiele für Python-Basic

Python UNO

Grundlegende 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 bei 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) (englisch) oder laden Sie das LibreOffice Software Development Kit (SDK) herunter.

Das Importieren eines in Python-Dokumente eingebetteten Moduls 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 Wunsch importieren
                    return zipimport.zipimporter(url).load_module(module_name)
            
            def import_embedded_python():
                ui = load_library("my_gui",'screen_io')  # Pfad <lib> hinzufügen und <module> importieren
                ui.MsgBox(sys.modules.keys())
            
            g_exportedScripts = (import_embedded_python,)  # Public macros
        

Bitte unterstützen Sie uns!