Содержимое

# Программирование с использованием сценариев Python

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

## Глобальная переменная XSCRIPTCONTEXT

Доступ к базовым функциям Basic UNO можно получить из глобальной переменной XSCRIPTCONTEXT. См. полное описание методов XSCRIPTCONTEXT в LibreOffice API. Ниже представлен общий список методов 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.

Доступ к базовым функциям Basic UNO можно получить из модуля uno.py. Полное описание модулей можно получить в интерактивной оболочке Python с помощью команд Python dir() и help().

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

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

## Ещё примеры функций для Python и Basic

UNO в Python | Функции Basic 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 при необходимости можно исследовать и импортировать. Более подробную информацию по контейнерам библиотек см. на LibreOffice Application Programming Interface (API) или загрузите LibreOffice Software Development Kit (SDK).

Импорт встроенного в документ модуля 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')  # добавьте <lib> путь + импорт <module>
                    ui.MsgBox(sys.modules.keys())

                g_exportedScripts = (import_embedded_python,)  # Public macros

См. также

Объекты, функции и службы Basic UNO

Импорт модулей Python

Ввод/Вывод на экран

Справка по макросам на Python в LibreOffice