Programování pomocí skriptů Pythonu

Makro Pythonu je funkce v souboru .py, který je rozpoznán jako modul. Na rozdíl od jazyka LibreOffice Basic, jenž obsahuje desítky objektů, funkcí a služeb UNO, používají makra Pythonu jediný objekt UNO XSCRIPTCONTEXT, který je sdílený s jazyky JavaScript a BeanShell. Seznam všech maker modulu, která lze vybrat, se nachází v globální n-tici g_exportedScripts. Moduly Pythonu obsahují samostatný a na ostatních modulech nezávislý kód.

Globální proměnná XSCRIPTCONTEXT

Možnosti, které nabízí UNO v Basicu, lze odvodit z globální proměnné XSCRIPTCONTEXT. Její kompletní popis naleznete v dokumentaci API pro LibreOffice. Metody proměnné XSCRIPTCONTEXT souhrnně:

Metoda

Popis

Mapována v Basicu jako

getDocument()

Odkaz na dokument, v němž může skript provádět činnost.

ThisComponent

getDesktop()

Odkaz na desktop, v němž může skript provádět činnost.

StarDesktop

getComponentContext()

Kontext komponenty, kterou může skript použít pro vytváření jiných komponent UNO.

GetDefaultContext


Příklady maker vztahujících se k objektům UNO a využívajících globální proměnnou XSCRIPTCONTEXT jsou nainstalované sdílené skripty HelloWorld a Capitalise.

tip

Při spouštění maker Pythonu z nabídky Nástroje - Makra - Spustit makro není k dispozici standardní výstupní soubor pro Python. Další informace naleznete v části Vstup a výstup na obrazovku.


Import modulu

warning

Pro importované moduly není proměnná XSCRIPTCONTEXT k dispozici.


Knihovny pro LibreOffice Basic obsahují třídy, podprogramy a proměnné, moduly Pythonu obsahují třídy, funkce a proměnné. Společné opětovně využitelné části pro Python nebo UNO je nutné uložit v kontejneru Moje makra v umístění (Uživatelský profil)/Scripts/python/pythonpath. Moduly jsou uspořádány do knihoven Pythonu, aby se zabránilo konfliktům mezi jejich názvy. Mezi sdílené moduly naimportujte uno.py.

Možnosti, které nabízí UNO Basicu, lze odvodit pomocí modulu uno.py. V interaktivním shellu Pythonu můžete získat úplný popis modulu pomocí příkazů dir() a help().

Funkce

Popis

Mapována v Basicu jako

absolutize()

Vrátí absolutní adresu URL souboru se zadaných adres.

createUnoStruct()

Vytvoří strukturu nebo výjimku UNO podle zadané hodnoty typeName.

CreateUNOStruct()

fileUrlToSystemPath()

Vrátí cestu v systému.

ConvertFromURL()

getClass()

Vrátí třídu určité výjimky, struktury nebo rozhraní typu UNO.

getComponentContext()

Vrátí kontext komponenty UNO použitý pro inicializaci běhového prostředí Pythonu.

GetDefaultContext()

Enum()

getConstantByName()

Vyhledá hodnotu konstanty IDL podle jejího názvu.

viz API pro skupiny konstant

isInterface()

Vrátí True, pokud je obj třída rozhraní UNO.

systemPathToFileUrl()

Vrátí adresu URL souboru pro zadanou cestu v systému.

ConvertToURL()


Modul uno.py používají nainstalované sdílené skripty LibreLogo a TableSample.

Další příklady

UNO Pythonu

UNO Basicu

ctx = uno.getComponentContext()

smgr = ctx.getServiceManager()

obj = smgr.createInstanceWithContext( .. , ctx)

CreateUnoService()

viz otevření dialogového okna

CreateUnoDialog()

viz vytvoření posluchače

CreateUnoListener()

viz datové typy UNO

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


Import vloženého modulu

LibreOffice Basic podporuje procházení a dynamické načítání knihoven a podobně lze procházet a na vyžádání importovat knihovny Pythonu. Další informace o kontejnerech pro knihovny naleznete v dokumentaci rozhraní pro programování aplikací (API) pro LibreOffice nebo stáhněte sadu Software Development Kit (SDK) pro LibreOffice.

Import vloženého modulu Pythonu je uveden níže. Zpracování výjimek je vynecháno.


            import uno, sys
            
            def load_library(library_name: str, module_name=None):
                """ načte knihovnu a naimportuje modul
                
                upraveno z příkladu "Bibliothèque de fonctions" od Huberta Lamberta
                na stránce https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213"""
                doc = XSCRIPTCONTEXT.getDocument()  # aktuální dokument
                url = uno.fileUrlToSystemPath( \
                    '{}/{}'.format(doc.URL, 'Scripts/python'+library_name))  # ConvertToURL()
                if not url in sys.path:  # přidá cestu, je-li to nutné
                    sys.path.insert(0, url)  # knihovna dokumentu má přednost
                if module_name:  # naimportuje, je-li požadováno
                    return zipimport.zipimporter(url).load_module(module_name)
            
            def import_embedded_python():
                ui = load_library("my_gui",'screen_io')  # přidá cestu s knihovnou a naimportuje modul
                ui.MsgBox(sys.modules.keys())
            
            g_exportedScripts = (import_embedded_python,)  # Public macros
        

Podpořte nás!