Программирование с использованием сценариев 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
        
Пожалуйста, поддержите нас!

Пожалуйста, поддержите нас!