Spis treści

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

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

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()
Użyj operatorów porównania "==" lub "!=" | 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

Tematy pokrewne

Obiekty UNO Basic, funkcje i usługi

Importowanie modułów Pythona

Wejście i wyjście ekranu

Pomoc skryptów Pythona LibreOffice