Kalde Basic-makroers fra Python

Du kan kalde LibreOffice Basic-makroer fra Python-scripts og til gengæld kan særlige funktioner opnås som fx:

LibreOffice Application Programming Interface (API) Scripting-netværket understøtter mellemsproglige script-udførelse mellem Python og Basic eller andre understøttede programerede sprog for den sags skyld. Argumenter kan passere frem på tværs af kald, forudsat at de repræsenterer primitive data-typer, som begge programmer genkender, og antaget at Scripting-miljøet konverterer den passende.

tip

Det anbefales, at have kendskab til Pythons standardmoduler og LibreOffice API-funktioner inden der udføres mellemsproglige kald fra Python til Basic, JavaScript eller en hvilken som helst anden Script-maskine.


warning

Under kørsel af Python-scripts fra et IDE (Integrated Development Environment = Integreret Udviklingsmiljø) kan den indlejrede Basic-motor i LibreOffice mangle. Undgå Python til LibreOffice Basic-kald i en sådan sammenhæng. Python-miljøet og Universal Networks Objekter (UNO) er fuldt tilgængelige. Se flere oplysninger i Opsætning af et Integreret IDE til Python.


Hent LibreOffice Basic-scripts

LibreOffice Basic-makroer kan være personlige, delte eller indlejrede i dokumenter. For at udføre dem skal Python afviklingsmiljøet være forsynes med placeringerne af Basic-makroer. Implementering af grænsefladen com.sun.star.script.provider.XScriptProvider tillader genfinding af eksekverbare scripts:


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

Eksekvering af LibreOffice Basic-scripts

LibreOffice Software Development Kit (SDK) dokumentationen til com.sun.star.script.provider.XScriptgrænsefladen forklarer kald-konventionen for mellemsproglige kald. Funktionskald kræver tre grupper:

Python Syntaks

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

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

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

Eksempler pĂĄ personlige eller delte scripts

Eksempler i Skærm-input/output forklarer detaljeret Python-til-Basic-kald. Overvågning af dokumenthændelser illustrerer brugen af *args Python idiomer til at udskrive en varierende antal af parametre til dialogen i logningskonsollen Access2Base.

tip

Under udviklingen kan du afbryde udføreæsen af Python-scripts med udvidelsen Xray for at inspicere egenskaber og metoder i UNO-objekter. Udvidelsesfejlhåndteringen APSO tillader inspection af objekter med en af udvidelserne Xray eller MRI.



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

Eksempler pĂĄ indlejrede scripts i dokumenter

Den forenklede Python *args-syntaks kan bruges i forbindelse med LibreOffice Basic-rutiner, som accepterer et varierende antal argumenter. Under Print og SUM kalder Python -funktioner deres Basic-modsvar Print og SUM med den førnævnte funktion getBasicScript. Undtagelseshåndtering gennemgås ikke.


	  # -*- coding: utf-8 -*-
	  from __future__ import unicode_literals
	      
	  def Print(*args):
	      """Skriver de specificerede strenge eller numeriske udtryk i et dialogfelt."""
	      xScript = getBasicScript("Print", "Scripting", embedded=True)
	      xScript.invoke((args), (), ())
	      
	  def SUM(*args):
	      """SUM lægger de specifiecerede taludtryk sammen."""
	      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,)
	  

De dokument-baserede LibreOffice Basic-rutiner Print and SUM accepterer et varierende antal argumenter. Attributterne Private eller Public har ingen virkning. Tjek af argumenttypen er udeladt for klarhedens skyld


	  Option Compatible ' "Standard.Scripting" module
	  Option Explicit
	      
	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
	      ''' Udskriv stykliste over variabelnumre '''
	      ' alle CStr()-konvertible args accepteres
	      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
	      ''' SUM sammentæl en variabel liste af tal '''
	      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()
	  

Støt os venligst!