Programowanie za pomocą skryptów Pythona

Makro Pythona to funkcja w pliku .py, identyfikowana jako moduł. W przeciwieństwie do LibreOffice Basic i tuzina funkcji lub usług obiektów UNO, makra Pythona używają pojedynczego obiektu UNO XSCRIPTCONTEXT, współdzielonego z JavaScript i BeanShell. Globalna krotka g_exportedScripts wyraźnie wyświetla wybieralne makra z modułu. Moduły Pythona przechowują autonomiczną logikę kodu i są od siebie niezależne.

Zmienna globalna XSCRIPTCONTEXT

Oryginalne obiekty UNO Basic można wywnioskować ze zmiennej globalnej XSCRIPTCONTEXT. Zapoznaj się z API LibreOffice, aby uzyskać pełny opis XSCRIPTCONTEXT. Metody XSCRIPTCONTEXT można podsumować następująco:

Metody

Opis

Mapowane w Basic jako

getDocument()

Odwołanie do dokumentu, w którym może działać skrypt.

ThisComponent

getDesktop()

Odniesienie do pulpitu, na którym może działać skrypt.

StarDesktop

getComponentContext()

Kontekst komponentu, którego skrypt może użyć do tworzenia innych komponentów UNO.

GetDefaultContext


Wspólne skrypty instalacyjne HelloWorld i Capitalise ilustrują makra związane z UNO wykorzystujące zmienną globalną XSCRIPTCONTEXT.

tip

Standardowy plik wyjściowy Pythona nie jest dostępny podczas uruchamiania makr Pythona z menu Narzędzia - Makra - Uruchom makro. Zobacz Wejście i wyjście ekranu, aby uzyskać więcej informacji.


Import modułu

warning

Element XSCRIPTCONTEXT nie jest dostarczany do importowanych modułów.


Biblioteki LibreOffice Basic zawierają klasy, procedury i zmienne, moduły Pythona zawierają klasy, funkcje i zmienne. Typowe fragmenty funkcji Pythona lub UNO wielokrotnego użytku muszą być przechowywane w Moich makrach w (Profil użytkownika)/Scripts/python/pythonpath. Biblioteki Pythona pomagają organizować moduły w celu zapobiegania kolizjom nazw modułów. Zaimportuj uno.py do współdzielonych modułów.

Oryginalne obiekty UNO BASIC można wywnioskować za pomocą modułu uno.py. Użyj interaktywnej powłoki Pythona, aby uzyskać pełny opis modułu za pomocą poleceń dir() i help() Pythona.

Funkcje

Opis

Mapowane w Basic jako

absolutize()

Zwraca bezwzględny adres URL pliku z podanych adresów URL.

createUnoStruct()

Tworzy strukturę UNO lub wyjątek określony przez typeName.

CreateUNOStruct()

fileUrlToSystemPath()

Zwraca ścieżkę systemową.

ConvertFromURL()

getClass()

Zwraca klasę konkretnego wyjątku UNO, struktury lub interfejsu.

getComponentContext()

Zwraca kontekst składnika UNO używany do inicjowania środowiska uruchomieniowego Pythona.

GetDefaultContext()

Enum()

getConstantByName()

Wyszukuje wartość stałej IDL, podając jej jawną nazwę.

Zobacz grupy stałych API

isInterface()

Zwraca True, gdy obj jest klasą interfejsu UNO.

systemPathToFileUrl()

Zwraca adres URL pliku dla podanej ścieżki systemowej.

ConvertToURL()


Preinstalowane skrypty LibreLogo, NamedRanges, SetCellColor i TableSample korzystają z modułu uno.py.

Więcej przykładów Python-Basic

UNO Pythona

Funkcje UNO Basic

ctx = uno.getComponentContext()

smgr = ctx.getServiceManager()

obj = smgr.createInstanceWithContext( .. , ctx)

CreateUnoService()

Zobacz Otwieranie okna dialogowego

CreateUnoDialog()

Zobacz Tworzenie detektora

CreateUnoListener()

Zobacz typy danych 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


Importowanie osadzonego modułu

Podobnie jak LibreOffice Basic, który obsługuje przeglądanie i dynamiczne ładowanie bibliotek, biblioteki Pythona można eksplorować i importować na żądanie. Aby uzyskać więcej informacji na temat kontenerów bibliotecznych, odwiedź LibreOffice Application Programming Interface (API) lub pobierz LibreOffice Software Development Kit (SDK).

Poniżej zilustrowano import wbudowanego modułu dokumentu Pythona, obsługa wyjątków nie jest szczegółowo opisana:


            import uno, sys, zipimport
            
            def load_library(library_name: str, module_name=None):
                """ załaduj bibliotekę i moduł importu
                
                przystosowano z 'Bibliothèque de fonctions' autorstwa Huberta Lamberta
                pod adresem https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213"""
                doc = XSCRIPTCONTEXT.getDocument()  # bieżący dokument
                url = uno.fileUrlToSystemPath( \
                    '{}/{}'.format(doc.URL, 'Scripts/python'+library_name))  # ConvertToURL()
                if not url in sys.path:  # dodaj ścieżkę, jeśli to konieczne
                    sys.path.insert(0, url)  # doclib ma pierwszeństwo
                if module_name:  # importuj na żądanie
                    return zipimport.zipimporter(url).load_module(module_name)
            
            def import_embedded_python():
                ui = load_library("my_gui",'screen_io')  # dodaj ścieżkę <lib> + import <module>
                ui.MsgBox(sys.modules.keys())
            
            g_exportedScripts = (import_embedded_python,)  # Public macros
        

Prosimy o wsparcie!