Anroper Basic Makroer fraPython

Du kan hente LibreOffice Basic makroer fra Python-skript, og viktige funksjoner kan fås i retur. For eksempel:

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 fourth across calls, providing they represent primitives data types that both languages recognize, and assuming that the Scripting Framework converts them appropriately.

tip

Det anbefales å ha kunnskap om Python-standardmoduler og LibreOffice API-funksjoner før du kan kjøre anrop fra Python til Basic, JavaScript eller andre skriptmotorer.


warning

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


Henter LibreOffice Basic-skript

LibreOffice Basic makroer kan være personlige, delte eller innebygd i dokumenter. For å kunne kjøre dem, må Python-run-time ha tilgang til de grunnleggende makrolokasjonene. Implementering avcom.sun.star.script.provider.XScriptProvider grensesnittet gir tilgang til å hentekjørbare skript:


		 import uno
		 from com.sun.star.script.provider import Xscript
		     
		 def getBasicScript(macro='Main', module='Module1', library='Standard',
		         isEmbedded=False) -> XScript:
		     '''Hent Basic skript objekter før aktivering.'''
		     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
		 

Kjører LibreOffice Basic Skript

LibreOffice Software Development Kit (SDK) dokumentasjon for com.sun.star.script.provider.XScript grensesnitett beskriver konvensjonen for anrop mellom språk. Aktivering av funksjoner krever tre matriser:

Python-syntaks

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

skriptaktivere ((melding,), tuple, ())

skript.aktiver((args), (), resultater)

Eksempler på personlige eller delte skript

Eksempler i Inndata/utdata til Skjerm har detaljer om Python til Basic-aktiveringskall. Overvåking av dokumenthendelser illustrerer bruken av * args Python-idiom for å skrive ut et variabelt antall parametere til Access2Base-konsoll-loggingsdialogen.

tip

På utviklingstidspunktet kan du avbryte utførelsen av Python-skript ved hjelp av Xray utvidelser for å inspisere egenskaper og metoder for UNO-objekter. APSO-utvidelsdebuggeren tillater introspeksjon av objekt ved hjelp av enten Xray eller MR-utvidelser.



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

Eksempler på innebygde skript i dokumenter

*argsPython-forenklet syntaks kan brukes i forbindelse med LibreOffice Basic-rutiner som godtar et variabelt antall argumenter. Under Skriv ut og SUMMER Python-funksjoner anroper deres Basic Skriv ut og SUMMER-motparter, ved å bruke den allerede nevnte getBasicScript-funksjonen. Avvikshåndteringen er ikke videre detaljert.


	  # -*- coding: utf-8 -*-
	  from __future__ import unicode_literals
	      
	  def Print(*args):
	      """Skriver ut de angitte strengene eller numeriske uttrykk i en dialogboks."""
	      xScript = getBasicScript("Print", "Scripting", embedded=True)
	      xScript.invoke((args), (), ())
	      
	  def SUM(*args):
	      """SUMMER det spesifiserte talluttrykket."""
	      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,)
	  

LibreOffice Basic Skriv Ut og SUMMER dokument-baserte rutiner aksepterer et variabelt antallargumenter. Privat eller Offentlig atributterhar ingen effekt. Argumenttypekontrollen hoppes over for tydelighetens skyld.


	  Option Compatible ' "Standard.Scripting" module
	  Option Explicit
	      
	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
	      ''' Skriv ut en liste med variable nummer '''
	      ' alle CStr() konvertible args aksepteres
	      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
	      ''' SUMMER en variabel liste med tall '''
	      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()
	  

Supporter oss!