Εισαγωγή αρθρωμάτων Python

Οι δέσμες ενεργειών Python του LibreOffice έρχονται σε τρεις διαφορετικές εκδόσεις, μπορούν να εξατομικευτούν, να μοιραστούν ή να ενσωματωθούν σε έγγραφα. Αποθηκεύονται σε διάφορες θέσεις που περιγράφονται στο Python Scripts Organization and Location. Για να εισάγετε αρθρώματα Python, οι τοποθεσίες τους πρέπει να είναι γνωστές από το Python κατά τον χρόνο εκτέλεσης.

Αυτός ο μηχανισμός απεικονίζεται για σύστημα αρχείου με βάση αρθρώματα και έγγραφο με βάση αρθρώματα. Ο χειρισμός εξαίρεσης παραλείπεται για σαφήνεια. Οι όροι βιβλιοθήκη ή κατάλογος, δέσμη ενεργειών ή αρθρώματα χρησιμοποιούνται εναλλακτικά. Μια μακροεντολή Python αναφέρεται σε συνάρτηση σε άρθρωμα.

warning

Σημειώστε ότι ο τοπικός κατάλογος <User Profile>/Scripts/python/pythonpath εξερευνάται πάντα όταν εκτελείται μακροεντολή Python από το <User Profile>/Scripts/python.


Εισαγωγή αρθρώματος συστήματος αρχείων

LibreOffice Basic libraries contain classes, routines and variables, Python modules contain classes, functions and variables. Common pieces of reusable Python or UNO features must be stored in My macros within (User Profile)/Scripts/python/pythonpath. Python libraries help organize modules in order to prevent module name collisions. Import uno.py inside shared modules.

Αρθρώματα χρήστη ή κοινόχρηστα

Προσωπικές κοινόχρηστες δέσμες ενεργειών Python μπορούν να εισαχθούν μόλις οι κατάλογοί τους συμπεριληφθούν στη διαδρομή χρόνου εκτέλεσης Python. Δείτε τη σελίδα Λήψη πληροφοριών συνεδρίας για περισσότερες λεπτομέρειες αναφορικά με τις παραλειπόμενες κλάσεις συνεδρίας.


        # -*- coding: utf-8 -*-
        from __future__ import unicode_literals
        import sys
            
        user_lib = Session().UserPythonScripts  # Τοποθεσία δέσμης ενεργειών χρήστη
        if not user_lib in sys.path:
            sys.path.insert(0, user_lib)  # Προσθήκη στη διαδρομή αναζήτησης
        import screen_io as ui  # το άρθρωμα 'screen_io.py' βρίσκεται στον κατάλογο user_lib
        # Ο κώδικας σας ακολουθεί εδώ
    

Αυτό το παράδειγμα Python εκθέτει μια τοπική μεταβλητή XSCRIPTCONTEXT σε εισαγόμενο άρθρωμα:


        # -*- coding: utf-8 -*-
        from __future__ import unicode_literals
        import uno, sys
            
        share_lib = Session.SharedPythonScripts()  # Κοινόχρηστη τοποθεσία δέσμης ενεργειών
        if not share_lib in sys.path:
            sys.path.insert(0, share_lib)  # Προσθήκη στη διαδρομή αναζήτησης
        from IDE_utils import ScriptContext  # το 'IDE_utils.py' βρίσκεται με τις κοινόχρηστες δέσμες ενεργειών του Python.
        XSCRIPTCONTEXT = ScriptContext(uno.getComponentContext)
        # Ο κώδικας σας ακολουθεί εδώ
    

Εγκατάσταση αρθρωμάτων για εφαρμογές

Αντίθετα με τις προσωπικές και κοινόχρηστες δέσμες ενεργειών, η εγκατάσταση δεσμών ενεργειών του LibreOffice μπορεί να εισαχθεί οποτεδήποτε. Πέρα από τα αρθρώματα Python uno & unohelper του LibreOffice, άλλες δέσμες ενεργειών που εμφανίζονται στον κατάλογο <installation_path>/program μπορούν να εισαχθούν απευθείας, όπως το άρθρωμα msgbox.

Με κέλυφος Python:

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

Εισαγωγή αρθρώματος εγγράφου

Η εισαγωγή ενσωματωμένου αρθρώματος εγγράφου Python περιγράφεται παρακάτω. Ο χειρισμός σφαλμάτων δεν είναι λεπτομερής. Η διαδρομή χρόνου εκτέλεσης Python ενημερώνεται όταν το έγγραφο έχει ανοιχθεί και πριν το κλείσιμο. Δείτε το Συμβαντοοδηγούμενες μακροεντολές (Event-Driven Macros) για να μάθετε πώς να συνδέσετε τις μακροεντολές Python με τα συμβάντα του εγγράφου.


        # -*- coding: utf-8 -*-
        from __future__ import unicode_literals
            
        import sys, uno
            
        def OnDocPostOpenLoadPython():
            """ Prepare Python modules import when doc. loaded """
            PythonLibraries.loadLibrary('lib/subdir')  # Προσθήκη καταλόγου στη διαδρομή αναζήτησης
            PythonLibraries.loadLibrary('my_gui', 'screen_io')  # Προσθήκη dir. & import screen_io
            
        def OnDocQueryCloseUnloadPython():
            """ Cleanup PYTHON_PATH when doc. Gets closed """
            PythonLibraries.unloadLibrary('my_gui')  # Καθαρισμός διαδρομής χρόνου εκτέλεσης Python
            # Σημείωση: τα εισαγόμενα αρθρώματα παραμένουν φορτωμένα σε αυτό το παράδειγμα.
            
        class PythonLibraries():
            """ Python library loader and module importer
            
            προσαρμοσμένο από το 'Bibliothèque de fonctions' του Hubert Lambert
            στο https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213"""
            def isImportedModule(module_name: str) -> bool:
                """ Check run time module list """
                return (module_name in sys.modules.keys())
            def isLoadedLibrary(lib_name: str) -> bool:
                """ Check PYTHON_PATH content """
                return (lib_name in sys.path)
            def loadLibrary(lib_name: str, module_name=None):
                """ add directory to PYTHON_PATH, import named 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):
                """ remove directory from PYTHON_PATH """
                sys.path.remove(lib_name)
            
        g_exportedScripts = (OnDocPostOpenLoadPython, OnDocQueryCloseUnloadPython)