Inhoud

# Python Modules Importeren

LibreOffice Python-scripts zijn er in drie verschillende smaken, ze kunnen persoonlijk zijn, worden gedeeld of ingesloten in documenten. Ze worden opgeslagen op verschillende plaatsen die worden beschreven inPython Scripts Organization and Location. Om Python-modules te kunnen importeren, moeten hun locaties tijdens runtime van Python bekend zijn.

Dit mechanisme wordt geïllustreerd voor op bestandssysteem gebaseerde modules en op documenten gebaseerde modules. De foutafhandeling is voor de duidelijkheid weggelaten. De termen bibliotheek of map, scripts of modules worden door elkaar gebruikt. Een Python-macro verwijst naar een functie in een module.

Merk op dat de lokale map <User Profile>/Scripts/python/pythonpath altijd wordt verkend bij het uitvoeren van een Python-macro van <User Profile>/Scripts/python.

## Bestandssysteemmodule importeren

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.

### Gebruiker of gedeelde modules

Persoonlijke en gedeelde Python-scripts kunnen worden geïmporteerd als hun directory's zijn opgenomen in het Python-runtime-pad. Raadpleeg Informatie over sessie-informatie voor meer informatie over weggelaten sessieklasse.

            # -*- coding: utf-8 -*-
            from __future__ import unicode_literals
            import sys

            user_lib = Session().UserPythonScripts  # Locatie scripts van gebruiker
            if not user_lib in sys.path:
                sys.path.insert(0, user_lib)  # Toevoegen aan zoekpad
            import screen_io as ui  # 'screen_io.py' module staat in map user_lib
            # Uw code volgt hier

In dit voorbeeld wordt in Python een lokale variabele XSCRIPTCONTEXT doorgegeven aan een geïmporteerde module:

            # -*- coding: utf-8 -*-
            from __future__ import unicode_literals
            import uno, sys

            share_lib = Session.SharedPythonScripts()  # Locatie voor gedeelde scripts
            if not share_lib in sys.path:
                sys.path.insert(0, share_lib)  # Toevoegen aan zoekpad
            from IDE_utils import ScriptContext  # 'IDE_utils.py' staat bij gedeelde Python-scripts.
            XSCRIPTCONTEXT = ScriptContext(uno.getComponentContext)
            # Uw code volgt hier

### Modules voor toepassingen installeren

In tegenstelling tot persoonlijke en gedeelde scripts kunnen LibreOffice installatie-scripts altijd worden geïmporteerd. Naast de uno en unohelper LibreOffice Python-modules kunnen de andere scripts in de map <installation_path>/program direct worden geïmporteerd, zoals bijvoorbeeld de module msgbox.

Met Python shell:

>>> 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"))

## Document Module Importeren

Het importeren van een in een Python-document ingebesloten module is hieronder beschreven. De foutafhandeling is beperkt. Het Python runtime-pad wordt bijgewerkt na het openen en voor het sluiten. Bekijk Event-Driven Macro's om te zien hoe u Python-macro's koppelt aan gebeurtenissen van het document.

            # -*- coding: utf-8 -*-
            from __future__ import unicode_literals

            import sys, uno

            def OnDocPostOpenLoadPython():
                """ Voorbereiden importeren Python-modules bij laden document """
                PythonLibraries.loadLibrary('lib/subdir')  # Map toevoegen aan zoekpad
                PythonLibraries.loadLibrary('my_gui', 'screen_io')  # Map toevoegen en screen_io importeren

            def OnDocQueryCloseUnloadPython():
                """ Opschonen PYTHON_PATH bij sluiten documenten """
                PythonLibraries.unloadLibrary('my_gui')  # Python runtime opschonen pad
                # NB: in het voorbeeld blijven geïmporteerde modules geladen.

            class PythonLibraries():
                """ lader van Python-bibliotheek en importeur van modules

                bewerkte versie van 'Bibliothèque de fonctions' door Hubert Lambert
                op https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213 """
                def isImportedModule(module_name: str) -> bool:
                    """ Controle runtime module-lijst """
                    return (module_name in sys.modules.keys())
                def isLoadedLibrary(lib_name: str) -> bool:
                    """ Controle inhoud PYTHON_PATH """
                    return (lib_name in sys.path)
                def loadLibrary(lib_name: str, module_name=None):
                    """ voeg map toe aan PYTHON_PATH, importeer aangegeven module """
                    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):
                    """ verwijder map uit PYTHON_PATH """
                    sys.path.remove(lib_name)

            g_exportedScripts = (OnDocPostOpenLoadPython, OnDocQueryCloseUnloadPython)

Verwante onderwerpen

Sessie-informatie ophalen

Programmeren met Python-scripts

Python-scripts organisatie en locatie

Bekijk Een Python Listener aanmaken voor voorbeelden van macro's die door gebeurtenissen aangestuurd worden.