目录
索引 🔎︎

# 用 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 相关的宏。

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

## 模块导入

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

相关主题

Basic UNO 对象、函数与服务

导入 Python 模块

屏幕输入/输出

LibreOffice Python 脚本帮助