Anroper Basic Makroer fraPython

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

LibreOffice Application Programming Interface (API) Scripting Framework, støtter kjøring av ulike språk script mellom Python og Basic, eller andre støttede programmeringsspråk for den saks skyld. Argumenter kan sendes frem og tilbake over anrop, forutsatt at de representerer primitive datatyper som begge språk gjenkjenner, og forutsatt at Scripting Framework konverterer dem på riktig måte.

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

Når du kjører Python-skript fra et integrert utviklingsmiljø (IDE), kan Deni LibreOffice-innebygde basicmotoren være fraværende. Unngå Python-til- LibreOffice Basic anrop i slike sammenhenger. Imidlertid er Python-miljøet og Universal Networks Objects (UNO) fullt tilgjengelig. Se Konfigurer et integrert IDE for Python for mer informasjon.


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), (), ())

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

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

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!