Python: Programmierung mit Python

Inhalte
Index 🔎︎

# 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.

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

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

Verwandte Themen

Grundlegende UNO-Objekte, -Funktionen und -Dienste

Importieren von Python-Modulen

Ein-/Ausgabe auf Bildschirm

LibreOffice Python-Skripte Hilfe