Conteúdo

# Invocar macros Basic via Python

Pode invocar macros do LibreOffice através de scripts Python, e funcionalidades notáveis podem ser obtidas tais como:

- Funcionalidades simples de registo da biblioteca Access2Base: registo na consola,

- InputBox e MsgBox, funções de E/S de ecrã baseadas em Basic para facilitar o desenvolvimento em Python,

- O Xray interrompe a execução do script Python para ajudar a inspecionar variáveis.

A estrutura de scripts da Interface de Programação de Aplicações (API) LibreOffice suporta a execução de scripts entre linguagens, nomeadamente entre Python e Basic, ou outras linguagens de programação compatíveis. Os argumentos podem ser transmitidos entre chamadas, desde que representem tipos de dados primitivos reconhecidos por ambas as linguagens e partindo do princípio de que a estrutura de scripts os converte adequadamente.

Recomenda-se ter conhecimentos sobre os módulos padrão do Python e as funcionalidades da API do LibreOffice antes de efetuar chamadas entre linguagens do Python para o Basic, JavaScript ou qualquer outro motor de script.

Ao executar scripts Python a partir de um Ambiente de Desenvolvimento Integrado (IDE), o motor Basic incorporado no LibreOffice pode não estar disponível. Evite chamadas de Python para o Basic do LibreOffice nesses contextos. No entanto, o ambiente Python e os Objetos de Redes Universais (UNO) estão totalmente disponíveis. Consulte Configurar um IDE integrado para Python para obter mais informações.

## Recuperação de LibreOffice: Scripts básicos

LibreOffice As macros Basic podem ser pessoais, partilhadas ou incorporadas em documentos. Para as executar, é necessário indicar ao motor de execução do Python as localizações das macros Basic. A implementação da interface com.sun.star.script.provider.XScriptProvider permite a recuperação de scripts executáveis:

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

    		 def getBasicScript(macro='Main', module='Module1', library='Standard',
    		         isEmbedded=False) -> XScript:
    		     '''Obtenha o objeto de script Basic antes da invocação.'''
    		     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

## Executar scripts Basic do LibreOffice

A documentação do Kit de Desenvolvimento de Software (SDK) LibreOffice para com.sun.star.script.provider.XScript detalha a convenção de chamada para chamadas entre linguagens. A invocação de funções requer três matrizes:

- o primeiro lista os argumentos da rotina invocada

- o segundo identifica os argumentos modificados

- o terceiro guarda os valores devolvidos

### Sintaxe Python

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

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

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

### Exemplos de scripts pessoais ou partilhados

Os exemplos em Entrada/Saída para o Ecrã detalham as chamadas de invocação de Python para Basic. Monitorização de eventos de documentos ilustra a utilização da expressão *args do Python para imprimir um número variável de parâmetros na caixa de diálogo da consola de registo do Access2Base.

Durante o desenvolvimento, é possível interromper a execução do script Python utilizando a extensão Xray para inspecionar as propriedades e métodos dos objetos UNO. O depurador da extensão APSO permite a introspecção de objetos utilizando as extensões Xray ou MRI.

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

### Exemplos de scripts incorporados em documentos

*argsA sintaxe simplificada do Python pode ser utilizada em conjunto com as rotinas Basic LibreOffice que aceitam um número variável de argumentos. Abaixo, as funções Python Print e SUM chamam as suas contrapartes Basic Print e SUM, utilizando a função getBasicScript acima mencionada. O tratamento de exceções não é detalhado.

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

    	  def Print(*args):
    	      """Exibe as cadeias de caracteres ou expressões numéricas especificadas numa caixa de diálogo."""
    	      xScript = getBasicScript("Print", "Scripting", embedded=True)
    	      xScript.invoke((args), (), ())

    	  def SUM(*args):
    	      """Soma a expressão 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,)

As rotinas baseadas em documentos LibreOffice Basic Print e SUM aceitam um número variável de argumentos. Os atributos Private ou Public não têm qualquer efeito. A verificação do tipo dos argumentos é ignorada por uma questão de clareza.

    	  Option Compatible ' "Standard.Scripting" module
    	  Option Explicit

    	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
    	      ''' Imprimir a lista de itens de número variável '''
    	      ' todos os argumentos convertíveis por CStr() são aceites
    	      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
    	      ''' SOMAR uma lista variável de números '''
    	      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()

Tópicos relacionados

Invocar scripts Python a partir do Basic

Exemplos de programação em Python

Ajuda para os scripts Python no LibreOffice

LibreOffice Ajuda básica

Necessitamos da sua ajuda!