用 Python 脚本编程

Python 宏是 .py 文件 (即模块) 中的单个函数。与 LibreOffice Basic 及其丰富的 UNO 对象函数或服务 不同,Python 宏使用 XSCRIPTCONTEXT UNO 单对象,与 JavaScript 和 BeanShell 共享。全局变量 g_exportedScripts 可列出模块中可选择的宏。Python 模块包含自动代码逻辑,互相独立。

XSCRIPTCONTEXT 全局变量

可从 XSCRIPTCONTEXT 全局变量推断出所有 Basic UNO 对象。参考 LibreOffice API 中完整的 XSCRIPTCONTEXT 描述XSCRIPTCONTEXT 方法小结:

方法

描述

在 Basic 中映射为

getDocument()

脚本可操作的文档引用。

ThisComponent

getDesktop()

脚本可操作的桌面引用。

StarDesktop

getComponentContext()

脚本可用来创建其他 uno 组件的组件上下文。

GetDefaultContext


安装的共享脚本「HelloWorld」与「Capitalise」演示了利用 XSCRIPTCONTEXT 全局变量的 UNO 相关的宏。

tip

从「工具 - 宏 - 运行宏」菜单运行 Python 宏时,Python 标准输出文件不可用。更多信息请参考「屏幕输入/输出」。


模块导入

warning

XSCRIPTCONTEXT 对导入模块不可用。


LibreOffice Basic 库包含类、例行程序与变量,Python 模块包含类、函数与变量。常用的 Python 或 UNO 功能必须存储在「我的宏」,路径为「(用户配置文件目录)/Scripts/python/pythonpath」。Python 库有助于组织模块,避免模块命名冲突。在共享模块中导入「uno.py」。

可使用 uno.py 模块推断出所有 Basic UNO 对象。可通过「Python 交互式 shell」使用 dir()help() Python 命令获取完整的模块描述。

函数

描述

在 Basic 中映射为

absolutize()

从指定 url 返回文件的绝对 url。

createUnoStruct()

根据 typeName 创建 UNO 结构或异常。

CreateUNOStruct()

fileUrlToSystemPath()

返回系统路径。

ConvertFromURL()

getClass()

返回具体 UNO 异常、结构或接口的类。

getComponentContext()

返回用于初始化 Python 运行时的 UNO 组件上下文。

GetDefaultContext()

Enum()

getConstantByName()

通过精确名称查找 IDL 常量的值。

参见「API 常量组」

isInterface()

当 obj 为 UNO 接口的类时返回 True。

systemPathToFileUrl()

返回指定系统路径的文件 URL。

ConvertToURL()


安装共享脚本「LibreLogo」与「TableSample」用到了 uno.py 模块。

更多 Python-Basic 示例

Python UNO

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 应用程序编程接口 (API)」或下载「LibreOffice 软件开发套件 (SDK)」。

下文演示导入 Python 文档内嵌模块的方法,异常处理未详细说明:


            import uno, sys
            
            def load_library(library_name: str, module_name=None):
                """ 载入库并导入模块
                
                引自 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
        

请支持我们!