Contingut
·

# Crida a macros bàsiques des de Python

Podeu cridar les macros bàsiques de LibreOffice des dels scripts de Python, i es poden obtindre característiques destacables a canvi, com ara:

- Instal·lacions de registre senzilles fora de la biblioteca Access2Base Consola de seguiment,

- Funcions d'E/S per pantalla InputBox i MsgBox basades en Basic per facilitar el desenvolupament en Python

- La crida Xray interrompeix l'execució dels scripts Python per ajudar a inspeccionar variables.

The LibreOffice Application Programming Interface (API) Scripting Framework supports inter-language script execution between Python and Basic, or other supported programming languages for that matter. Arguments can be passed back and forth across calls, provided that they represent primitive data types that both languages recognize, and assuming that the Scripting Framework converts them appropriately.

Es recomana tindre coneixement dels mòduls estàndard de Python i de les característiques de l'API de LibreOffice abans de realitzar crides des de Python al Basic, JavaScript o qualsevol altre motor d'scripts.

When running Python scripts from an Integrated Development Environment (IDE), the LibreOffice-embedded Basic engine may be absent. Avoid Python-to-LibreOffice Basic calls in such contexts. However Python environment and Universal Networks Objects (UNO) are fully available. Refer to Setting Up an Integrated IDE for Python for more information.

## S'estan recuperant els scripts de LibreOffice Basic

Les macros LibreOffice Basic poden ser personals, compartides, o incrustades en documents. Per tal d'executar-les, cal proporcionar a l'entorn d'execució de Python les ubicacions de les macro de Basic. Implementar la interfície com.sun.star.script.provider.XScriptProvider permet la recuperació d'scripts executables

<bookmarkvalue>API;script.provider.MasterScriptProviderFactory: Recuperació d'scripts Basic</bookmarkvalue><bookmarkvalue>API;script.provider.XScript Execució d'scripts Basic</bookmarkvalue><bookmarkvalue>API;XScriptProvider Recuperació d'scripts Basic </bookmarkvalue>

    		 import uno
    		 from com.sun.star.script.provider import Xscript

    		 def getBasicScript(macro='Main', module='Module1', library='Standard',
    		         isEmbedded=False) -> XScript:
    		     '''Obteniu l'objecte script Basic abans d'invocar-lo.'''
    		     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

## Execució d'scripts del LibreOffice Basic

La documentació del Software Development Kit (SDK) del LibreOffice corresponent a la interfície com.sun.star.script.provider.XScript detalla la convenció de crides entre llenguatges. La invocació de funcions requereix tres matrius:

- el primer llista els arguments de la rutina cridada

- el segon identifica els arguments modificats

- el tercer emmagatzema els valors retornats

### Sintaxi Python

results = script.invoke((prompt,buttons,title), (), ())

script.invoke((message,), tuple, ())

script.invoke((args), (), results)

### Exemples d'scripts personals o compartits

Exemples a Entrada/Eixida a Pantalla detall de crides d'invocació Python a Basic. El Monitoratge d'esdeveniments dels documents mostra l'ús de *args de Python per imprimir el nombre variable de paràmetres a la consola Access2Base.

En el moment del desenvolupament podeu interrompre l'execució dels scripts en Python utilitzant l' Extensió xray per tal d'inspeccionar propietats i mètodes d'objectes UNO. L'extensió APSO per a la depurarció, permet la introspecció d'objectes utilitzant qualsevol de les extensions Xray o MRI.

    	  def xray(myObject):
    	  	  script = getBasicScript(library="XrayTool", module="_Main", macro="Xray")
    	  	  script.invoke((myObject,), (), ())

### Exemples d'scripts incrustats als documents

La sintaxi simplificada de Python *args es pot utilitzar conjuntament amb les rutines Basic de LibreOffice que accepten un nombre variable d'arguments. A continuació les funcions Python Printi SUM criden les seues corresponents a Basic Printi SUMutilitzant la funció getBasicScript . La gestió d'excepcions no és detallada.

    	  # -*- coding: utf-8 -*-
    	  from __future__ import unicode_literals

    	  def Print(*args):
    	      ""Extreu les cadenes o expressions numèriques especificades en un diàleg."""
    	      xScript = getBasicScript("Print", "Scripting", embedded=True)
    	      xScript.invoke((args), (), ())

    	  def SUM(*args):
    	      ""SUMA l'expressió numèrica especificada.""
    	      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,)

Les rutines basades en documents de LibreOffice Basic Print and SUM accepten un nombre variable d’arguments. Els atributs Private o Public no tenen efecte. La comprovació del tipus d’arguments s’ignora per tindre més claredat.

    	  Option Compatible ' "Standard.Scripting" module
    	  Option Explicit

    	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
    	      ''' Imprimeix la llista d'elements en nombre variable '''
    	      ' s'accepten tots els arguments convertibles mitjançant 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
    	      ''' SUMA una llista de nombres variable '''
    	      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()

Temes relacionats

Cridar scripts de Python des de Basic

Exemples de programació en Python

Ajuda dels scripts de Python en el LibreOffice

8LibreOffice Ajuda bàsica