Obsah

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

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

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í předinstalované skripty LibreLogo, NamedRanges, SetCellColor 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

Podobně jako LibreOffice Basic, který podporuje procházení a dynamické načítání knihoven, lze knihovny Pythonu prozkoumávat a importovat na vyžádání. Další informace o kontejnerech knihoven naleznete na adrese LibreOffice Application Programming Interface (API) nebo si stáhněte LibreOffice Software Development Kit (SDK).

Import vloženého modulu dokumentu Python je znázorněn níže, zpracování výjimek není podrobně popsáno:

                import uno, sys, zipimport

                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

Související témata

Objekty, funkce a služby UNO v Basicu

Import modulů Pythonu

Vstup a výstup na obrazovku

Nápověda pro skripty Pythonu v LibreOffice