Съдържание

# Програмиране със скриптове на Python

Макросът на Python е функция в .py файл, идентифициран като модул. За разлика от LibreOffice Basic и десетките му обекти, функции и услуги на UNO, макросите на Python използват единичния обект XSCRIPTCONTEXT на UNO, също като JavaScript и BeanShell. В глобалния кортеж g_exportedScripts изрично се изброяват избираемите макроси от даден модул. Модулите на Python съдържат автономна програмна логика и са независими един от друг.

## Глобална променлива XSCRIPTCONTEXT

Оригиналните средства за работа с UNO на Basic могат да бъдат достигнати чрез глобалната променлива XSCRIPTCONTEXT. Вижте документацията на LibreOffice API за пълно описание на XSCRIPTCONTEXT. Ето обобщение на методите на XSCRIPTCONTEXT:

Методи | Описание | Съответствие в Basic
--- | --- | ---
getDocument() | Псевдонимът на документ, върху който може да действа скриптът. | ThisComponent
getDesktop() | Псевдонимът на работен плот, върху който може да действа скриптът. | StarDesktop
getComponentContext() | Контекстът на компонент, който скриптът може да използва за създаване на други компоненти на UNO. | GetDefaultContext

Споделените в рамките на инсталацията скриптове HelloWorld и Capitalise илюстрират как свързаните с UNO макроси използват глобалната променлива XSCRIPTCONTEXT.

При стартиране на макроси на Python от менюто Инструменти - Макроси - Стартиране на макрос не е достъпен стандартният файл за изход на Python. Вижте Вход/изход към екрана за повече информация.

## Импортиране на модули

XSCRIPTCONTEXT не се предоставя на импортирани модули.

Библиотеките на LibreOffice Basic съдържат класове, подпрограми и променливи, а модулите на Python – класове, функции и променливи. Общите части с многократно използваема функционалност на Python или UNO трябва да се съхраняват в Моите макроси в (потребителски профил)/Scripts/python/pythonpath. Библиотеките на Python помагат за организирането на модулите с цел да се избегнат конфликти в имената на модули. Импортирайте uno.py в споделените модули.

Оригиналният интерфейс за UNO на BASIC е достижим посредством модула uno.py. Използвайте интерактивната обвивка на Python, за да получите пълно описание на модула чрез командите dir() и help().

Функции | Описание | Съответствие в Basic
--- | --- | ---
absolutize() | Връща абсолютен URL адрес от дадени URL адреси. |
createUnoStruct() | Създава структура или изключение на UNO, указано от typeName. | CreateUNOStruct()
fileUrlToSystemPath() | Връща системен път. | ConvertFromURL()
getClass() | Връща класа на конкретно изключение, структура или интерфейс на UNO. |
getComponentContext() | Връща контекста на компонент на UNO, използван за инициализиране на средата за изпълнение на Python. | GetDefaultContext()
Enum() getConstantByName() | Намира стойността на IDL константа по изричното ѝ име. | Вижте групите от константи на API
isInterface() | Връща True, когато obj е клас на интерфейс на UNO. |
systemPathToFileUrl() | Връща файлов URL адрес за дадения системен път. | ConvertToURL()

Предварително инсталираните скриптове LibreLogo, NamedRanges, SetCellColor и TableSample използват модула uno.py.

## Още примери за връзка Python-Basic

Python UNO | Основна функционалност на UNO
--- | ---
ctx = uno.getComponentContext() smgr = ctx.getServiceManager() obj = smgr.createInstanceWithContext( .. , ctx) | CreateUnoService()
Вижте Отваряне на диалогов прозорец | CreateUnoDialog()
Вижте Създаване на слушател | CreateUnoListener()
Вижте „Типове от данни на 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

## Импортиране на вграден модул

Подобно на LibreOffice Basic, който поддържа преглеждане и динамично зареждане на библиотеки, библиотеките на Python могат да бъдат преглеждани и зареждани при поискване. За повече информация относно библиотечните контейнери вижте интерфейса за приложно програмиране (API) на LibreOffice или изтеглете софтуерния развоен пакет (SDK) на LibreOffice.

По-долу е илюстрирано импортирането на вграден в документ модул на Python, обработката на изключения не е показана:

                import uno, sys, zipimport

                def load_library(library_name: str, module_name=None):
                    """ зареждане на библиотеката и импортиране на модула

                    Адаптирано от „Bibliothèque de fonctions“ от Юбер Ламбер (Hubert Lambert)
                    на адрес https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213"""
                    doc = XSCRIPTCONTEXT.getDocument()  # текущ документ
                    url = uno.fileUrlToSystemPath( \
                        '{}/{}'.format(doc.URL, 'Scripts/python'+library_name))  # ConvertToURL()
                    if not url in sys.path:  # добавяме път, ако е необходимо
                        sys.path.insert(0, url)  # doclib е с предимство
                    if module_name:  # импорт, ако е поискан
                        return zipimport.zipimporter(url).load_module(module_name)

                def import_embedded_python():
                    ui = load_library("my_gui",'screen_io')  # добавяме <библиотека> път + импорт <модул>
                    ui.MsgBox(sys.modules.keys())

                g_exportedScripts = (import_embedded_python,)  # Public macros

Теми, свързани с показаната

Основни обекти, функции и услуги на UNO

Импортиране на модули на Python

Вход/изход към екрана

Помощ за скриптовете на Python в LibreOffice