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.

tip

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

warning

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 en TableSample installatie gedeelde scripts gebruiken 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()

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 ingebedde module importeren

Vergelijkbaar met LibreOffice Basic die het browsen en dynamisch laden van bibliotheken ondersteunt, kunnen in Python bibliotheken op aanvraag worden verkend en geïmporteerd. Voor meer informatie hierover: LibreOffice Application Programming Interface (API) of download LibreOffice Software Development Kit (SDK).

Het importeren van een in een Python-document ingebedde module is hieronder beschreven. De foutafhandeling is beperkt:


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

Help ons, alstublieft!