Помощ за LibreOffice 24.8
От скриптовете на Python можете да извиквате макроси на LibreOffice Basic, което ви дава достъп до следните важни възможности:
прости средства за регистриране (logging) в конзолата Trace от библиотеката Access2Base,
базирани на Basic функции за екранен вход и изход InputBox и MsgBox, улесняващи разработването с Python,
извиквания на Xray, които прекъсват изпълнението на скрипта на Python, позволявайки инспектиране на променливи.
Обкръжението за скриптове (Scripting Framework) на интерфейса за приложно програмиране (API) на LibreOffice поддържа многоезиково изпълнение между Python и Basic, както и между други езици. При обръщенията могат да се предават аргументи в двете посоки, стига да представят разпознавани и от двата езика примитивни типове данни, които Scripting Framework е в състояние да преобразува правилно.
Преди да използвате междуезикови обръщения от Python към Basic, JavaScript или друга скриптова машина, е препоръчително да се запознаете със стандартните модули на Python и възможностите на LibreOffice API.
Когато стартирате скриптове на Python от интегрирана развойна среда (IDE), вградената машина за Basic на LibreOffice може да отсъства. В такъв контекст избягвайте обръщения от Python към LibreOffice Basic. Обкръжението на Python и Universal Networks Objects (UNO) обаче са изцяло достъпни. Вижте Инсталиране на интегрирана развойна среда за Python за повече информация.
Макросите на LibreOffice Basic могат да бъдат лични, споделени или вградени в документи. За да ги изпълнява, системата за изпълнение на Python трябва да разполага с местоположенията им. Реализирането на интерфейса com.sun.star.script.provider.XScriptProvider позволява извличането на изпълними скриптове:
import uno
from com.sun.star.script.provider import Xscript
def getBasicScript(macro='Main', module='Module1', library='Standard',
isEmbedded=False) -> XScript:
'''Получаваме скриптов обект на Basic преди извикването.'''
ctx = uno.getComponentContext()
smgr = ctx.ServiceManager
if isEmbedded:
desktop = smgr.createInstanceWithContext('com.sun.star.frame.Desktop', ctx)
scriptPro = desktop.CurrentComponent.getScriptProvider()
location = "document"
else:
mspf = smgr.createInstanceWithContext(
"com.sun.star.script.provider.MasterScriptProviderFactory", ctx)
scriptPro = mspf.createScriptProvider("")
location = "application"
scriptName = "vnd.sun.star.script:"+library+"."+module+"."+macro+ \
"?language=Basic&location="+location
xScript = scriptPro.getScript(scriptName)
return xScript
Документацията на комплекта за разработка на софтуер (SDK) на LibreOffice за интерфейса com.sun.star.script.provider.XScript описва конвенцията за междуезикови обръщения. Извикването на функция изисква три масива:
Първият изброява аргументите на извикваната подпрограма.
Вторият посочва модифицираните аргументи.
Третият съдържа връщаните стойности.
results = script.invoke((prompt,buttons,title), (), ())
script.invoke((message,), tuple, ())
script.invoke((args), (), results)
Примерите във Вход/изход към екрана описват обръщения от Python към Basic. Наблюдение на събития в документите илюстрира използването на идиома *args на Python за отпечатване на променлив брой параметри в конзолния диалог на Access2Base.
По време на разработване можете да прекъсвате изпълнението на скрипт на Python с разширението Xray, за да инспектирате свойствата и методите на UNO обекти. Дебъгерът на разширения APSO позволява интроспекция на обекти чрез разширението Xray или разширението MRI.
def xray(myObject):
script = getBasicScript(library="XrayTool", module="_Main", macro="Xray")
script.invoke((myObject,), (), ())
Опростеният синтаксис *args на Python може да бъде използван с подпрограми на LibreOffice Basic, които приемат променлив брой аргументи. По-долу функциите Print и SUM на Python извикват съответствията си от Basic Print и SUM с помощта на гореспоменатата функция getBasicScript. Обработката на изключения не е показана.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
def Print(*args):
"""Извежда указаните низови или числови изрази в диалогов прозорец."""
xScript = getBasicScript("Print", "Scripting", embedded=True)
xScript.invoke((args), (), ())
def SUM(*args):
"""Сумира указания числов израз."""
xScript = getBasicScript("SUM", "Scripting", embedded=True)
res = xScript.invoke((args), (), ())
return res[0]
# def getBasicScript() # see above
def playWithArgs():
Print("Fun with *args ", -9.81, 297864.681974, 8762E-137)
Print(SUM(45, -9.81, 297864.681974))
Print(SUM(45, -9.81, 297864.681974, 8762E+137))
g_exportedScripts = (playWithArgs,)
Базираните на документ подпрограми Print и SUM на LibreOffice Basic приемат променлив брой аргументи. Атрибутите Private или Public не действат. За яснота е пропусната проверката на типа на аргументите.
Option Compatible ' "Standard.Scripting" module
Option Explicit
Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
''' Отпечатване на списък с променлив брой елементи '''
' Приемат се всички аргументи, поддържащи преобразуване с CStr().
Dim str As String, i As Integer
If UBound(args) >= 0 Then
For i = 0 To UBound(args)
str = str + Cstr(args(i))+ sep
Next i
End If
Print str
End Sub ' Standard.Scripting.Print()
Public Function SUM(ParamArray args() As Variant) As Variant
''' Сумиране на променлив брой числа '''
Dim ndx As Integer
If UBound(args) >= 0 Then
For ndx = 0 To UBound(args)
SUM = SUM + args(ndx)
Next ndx
End If
End Function ' Standard.Scripting.SUM()