Nápověda LibreOffice 24.8
Skripty Pythonu mohou být v LibreOffice trojího typu: osobní, sdílené nebo vložené v dokumentech. Jsou ukládány na různá místa popsaná v části Uspořádání a umístění skriptů Pythonu. Aby bylo možné moduly Pythonu importovat, musí být v době běhu jejich umístění známa.
V příkladu je toto znázorněno pro moduly ze souborového systému a pro moduly vložené v dokumentu. Pro přehlednost je vynecháno zpracování výjimek. Zaměnitelně jsou používány termíny knihovna nebo adresář a skripty nebo moduly. Termín makro Pythonu odkazuje na funkci v modulu.
Při spouštění makra Pythonu z umístění <uživatelský profil>/Scripts/python se vždy prochází lokální adresář <uživatelský profil>/Scripts/python/pythonpath.
Osobní a sdílené skripty lze importovat, pokud jsou jejich adresáře zahrnuty v cestě běhového prostředí Pythonu. Podrobnosti týkající se vynechané třídy Session naleznete na stránce Získávání informací o relaci.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import sys
user_lib = Session().UserPythonScripts # umístění uživatelských skriptů
if not user_lib in sys.path:
sys.path.insert(0, user_lib) # Přidá k prohledávaným cestám
import screen_io as ui # modul 'screen_io.py' se nachází v adresáři user_lib
# Následuje vlastní kód
V tomto příkladu v Pythonu je importovaný modul použit k vytvoření lokální proměnné XSCRIPTCONTEXT:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import uno, sys
share_lib = Session.SharedPythonScripts() # umístění sdílených skriptů
if not share_lib in sys.path:
sys.path.insert(0, share_lib) # Přidá k prohledávaným cestám
from IDE_utils import ScriptContext # 'IDE_utils.py' se nachází ve sdílených skriptech Pythonu
XSCRIPTCONTEXT = ScriptContext(uno.getComponentContext)
# Následuje vlastní kód
Na rozdíl od osobních a sdílených skriptů je možné skripty z instalace LibreOffice importovat kdykoliv a přímo. Kromě modulů Pythonu pro LibreOffice uno a unohelper se to týká i dalších skriptů, které se nacházejí v adresáři <cesta_k_instalaci>/program, například modulu msgbox.
Pomocí shellu Pythonu:
>>> import msgbox, uno
>>> myBox = msgbox.MsgBox(uno.getComponentContext())
>>> myBox.addButton("okay")
>>> myBox.renderFromButtonSize()
>>> myBox.numberOflines = 2
>>> print(myBox.show("A small message",0,"Dialog title"))
Následující příklad ilustruje import modulu Pythonu vloženého v dokumentu. Zpracování chyb je vynecháno. Cesta běhového prostředí Pythonu se aktualizuje ve chvíli, kdy se dokument otevře, a před tím, než se zavře. Návod, jak přiřadit makra Pythonu k událostem v dokumentu, naleznete v části Makra řízená událostmi.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import sys, uno
def OnDocPostOpenLoadPython():
""" Během načtení dokumentu připraví import modulů Pythonu """
PythonLibraries.loadLibrary('lib/subdir') # Přidá adresář k prohledávaným cestám
PythonLibraries.loadLibrary('my_gui', 'screen_io') # Přidá adresář a naimportuje screen_io
def OnDocQueryCloseUnloadPython():
""" Během zavírání dokumentu vyčistí PYTHON_PATH """
PythonLibraries.unloadLibrary('my_gui') # Vyčistí cesty běhového prostředí Pythonu
# Poznámka: v tomto příkladu zůstane importovaný modul načtený.
class PythonLibraries():
""" Knihovna Pythonu pro načítání a import 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 """
def isImportedModule(module_name: str) -> bool:
""" Zkontroluje seznam modulů """
return (module_name in sys.modules.keys())
def isLoadedLibrary(lib_name: str) -> bool:
""" Zkontroluje obsah PYTHON_PATH """
return (lib_name in sys.path)
def loadLibrary(lib_name: str, module_name=None):
""" přidá adresář do PYTHON_PATH, naimportuje modul podle názvu """
doc = XSCRIPTCONTEXT.getDocument()
url = uno.fileUrlToSystemPath(
'{}/{}'.format(doc.URL,'Scripts/python/'+lib_name)
if not url in sys.path:
sys.path.insert(0, url)
if module_name and not module_name in sys.modules.keys():
return zipimport.zipimporter(url).load_module(module_name)
def unloadLibrary(lib_name: str):
""" odstraní adresář z PYTHON_PATH """
sys.path.remove(lib_name)
g_exportedScripts = (OnDocPostOpenLoadPython, OnDocQueryCloseUnloadPython)