Inhoud

# Programmeren met Python-scripts

Een Python-macro is een functie in een py-bestand, geïdentificeerd als een module. In tegenstelling tot LibreOffice BASIC met zijn UNO-objecten functies en services, gebruiken Python-macro's het XSCRIPTCONTEXT UNO-object, gedeeld met JavaScript en Beanshell. De globale tuple g_exportedScripts vermeldt expliciet selecteerbare macro's in een module. Python-modules bevatten autonome codelogica en zijn onafhankelijk van elkaar.

## XSCRIPTCONTEXT globale variabele

De zuivere Basic UNO-faciliteiten kunnen beïnvloedt worden met de XSCRIPTCONTEXT globale variabele. Lees de LibreOffice-API voor een beschrijving van XSCRIPTCONTEXT. De XSCRIPTCONTEXT methodes zijn in het kort:

Methodes | Omschrijving | Toegewezen in BASIC als
--- | --- | ---
getDocument() | De documentreferentie waarop het script kan werken. | ThisComponent
getDesktop() | De desktopreferentie waarop het script kan werken. | StarDesktop
getComponentContext() | De componentcontext die het script kan gebruiken om andere uno-componenten te maken. | GetDefaultContext

HelloWorld en Capitalise installatie gedeelde scripts tonen aan hoe UNO-macro's de globale variabele XSCRIPTCONTEXT gebruiken.

Standaard uitvoerbestand van Python is niet beschikbaar bij het uitvoeren van Python-macro's via het menu Extra - Macro's - Macro uitvoeren. Bekijk Invoer/uitvoer naar scherm voor meer informatie.

## Module-import

XSCRIPTCONTEXT wordt niet voorzien voor geïmporteerde modules.

LibreOffice Basic-bibliotheken bevatten klassen, routines en variabelen, Python-modules bevatten klassen, functies en variabelen. Herbruikbare delen met Python en UNO-functionaliteit moeten opgeslagen worden in My macros onder (User Profile)/Scripts/python/pythonpath. Python-bibliotheken zorgen voor het organiseren van modules zodat er geen problemen ontstaan door het gebruik van dezelfde module-naam. Importeer uno.py binnen de gedeelde modules.

Echte BASIC UNO faciliteiten kunnen worden afgeleid met module uno.py. Gebruik de Python interactieve shell om de volledige beschrijving van de module te krijgen met dir() and help() Python-opdrachten.

Functies | Omschrijving | Toegewezen in BASIC als
--- | --- | ---
absolutize() | Retourneert een absolute URL van het bestand van de gegeven URL's. |
createUnoStruct() | Maakt voor een opgegeven typeName een UNO struct of exception aan. | CreateUNOStruct()
fileUrlToSystemPath() | Retourneert een systeempad. | ConvertFromURL()
getClass() | Retourneert de klasse van een bepaalde UNO exception, struct of interface. |
getComponentContext() | Retourneert de UNO component context om de Python runtime te initialiseren. | GetDefaultContext()
Enum() getConstantByName() | Zoekt op gegeven naam de waarde op van een IDL-constante. | Zie de API constante groepen
isInterface() | Controle of een object van de klasse UNO-interface is (TRUE). |
systemPathToFileUrl() | Retourneert voor een gegeven systeempad de bestands-URL. | ConvertToURL()

LibreLogo, NamedRanges, SetCellColor en TableSample voorgeïnstalleerde scripts, gebruik de module uno.py.

## Meer Python-BASIC voorbeelden

Python UNO | Basis UNO functionaliteit
--- | ---
ctx = uno.getComponentContext() smgr = ctx.getServiceManager() obj = smgr.createInstanceWithContext( .. , ctx) | CreateUnoService()
Bekijk Een dialoog openen | CreateUnoDialog()
Een listener aanmaken | CreateUnoListener()
Bekijk UNO-datatypes | CreateUnoValue() CreateObject()
Gebruik de vergelijkingsoperatoren "==" of "|=" | 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

## Een ingesloten module importeren

Net als LibreOffice Basic dat browsen en dynamisch laden van bibliotheken ondersteunt, kunnen Python-bibliotheken op aanvraag worden verkend en geïmporteerd. Ga voor meer informatie over bibliotheekcontainers naar LibreOffice Application Programming Interface (API) of download LibreOffice Software Development Kit (SDK).

Het importeren van een ingesloten Python-documentmodule wordt hieronder geïllustreerd, de afhandeling van uitzonderingen wordt niet gedetailleerd:

                import uno, sys, zipimport

                def load_library(library_name: str, module_name=None):
                    """ bibliotheek laden en module importeren

                    Bewerkte versie van 'Bibliothèque de fonctions' door Hubert Lambert
                    op https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213"""
                    doc = XSCRIPTCONTEXT.getDocument()  # huidige document
                    url = uno.fileUrlToSystemPath( \
                        '{}/{}'.format(doc.URL, 'Scripts/python'+library_name))  # ConvertToURL()
                    if not url in sys.path:  # pad toevoegen indien nodig
                        sys.path.insert(0, url)  # eerst wordt in doclib gezocht
                    if module_name:  # importeren bij verzoek
                        return zipimport.zipimporter(url).load_module(module_name)

                def import_embedded_python():
                    ui = load_library("my_gui",'screen_io')  # toevoegen pad <lib> path en <module>importeren
                    ui.MsgBox(sys.modules.keys())

                g_exportedScripts = (import_embedded_python,)  # Public macros

Verwante onderwerpen

Basic UNO objecten, functies en services

Python Modules Importeren

Invoer/uitvoer naar scherm

Hulp bij LibreOffice Python-scripts