Klicanje makrov Basic s Pythonom

Makre LibreOffice Basic lahko kličete iz skriptov Python, s čimer pridobite pomembne funkcionalnosti, kot so:

Ogrodje skriptov vmesnika programiranja LibreOffice API (angl. Application Programming Interface) podpira izvajanje skriptov med Pythonom in Basicom ter drugimi podprtimi programskimi jeziki. Argumente lahko podajate skozi klice, če gre za primitivne vrste podatkov, ki jih prepoznata oba jezika, in če jih ogrodje API ustrezno pretvori.

tip

Priporočeno je, da se uporabnik pred začetkom oblikovanja klicev iz Pythona v Basic, JavaScript ali drugi skriptni mehanizem pouči o standardnih modulih Python in funkcionalnostih LibreOffice API.


warning

Ko poganjate skripte Python iz okolja IDE (Integrated Development Environment), morda pogon Basic, vgnezden v LibreOffice, ne bo na voljo. V tem primeru priporočamo, da se izognite sklicem iz Pythona v LibreOffice Basic. Kljub temu so okolje Python in predmeti UNO (Universal Networks Objects) na voljo. Za več informacij preberite Nastavljanje integriranega IDE za Python.


Pridobivanje skriptov LibreOffice Basic

Makri LibreOffice Basic so lahko zasebni, v skupni rabi ali vdelani v dokumente. Za izvajanje je treba Pythonu navesti lokacije makrov Basic. Implementacija vmesnika com.sun.star.script.provider.XScriptProvider omogoča pridobivanje izvajalnih skriptov:


		 import uno
		 from com.sun.star.script.provider import Xscript
		     
		 def getBasicScript(macro='Main', module='Module1', library='Standard',
		         isEmbedded=False) -> XScript:
		     '''Zagrabi predmet skripta Basic pred priklicem.'''
		     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
		 

Izvajanje skriptov LibreOffice Basic

Dokumentacija za razvojni paket LibreOffice Software Development Kit (SDK) za vmesnik com.sun.star.script.provider.XScript podrobno opisuje delovanje klicev med programskima jezikoma. Priklic funkcij zahteva tri matrike:

Skladnja Pythona

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

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

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

Primeri osebnih skriptov in skriptov v skupni rabi

Primeri v Vhod/izhod na zaslon podrobno izkazujejo klice iz Pythona v Basic. Spremljanje dogodkov dokumenta ilustrira rabo idioma *args v Pythonu za izpis spremenljivega števila parametrov v pogovorno okno konzole beleženja Access2Base.

tip

Med razvojem lahko prekinete izvajanje skripta Python z razširitvijo Xray, s katero preverite lastnosti in metode predmetov UNO. Razhroščevalnik razširitve APSO omogoča introspekcijo predmetov s pomočjo razširitve Xray ali MRI.



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

Primeri v dokumente vdelanih skriptov

Poenostavljeno Pythonovo skladnjo *args lahko uporabite skupaj s podprogrami LibreOffice Basic, ki sprejmejo spremenljivo število argumentov. Pythonovi funkciji Print in SUM kličeta Print in SUM v Basicu z že omenjeno funkcijo getBasicScript. Izjeme niso podrobno obravnavane.


	  # -*- coding: utf-8 -*-
	  from __future__ import unicode_literals
	      
	  def Print(*args):
	      """Izpiše določene nize ali številske izraze v pogovorno okno."""
	      xScript = getBasicScript("Print", "Scripting", embedded=True)
	      xScript.invoke((args), (), ())
	      
	  def SUM(*args):
	      """Sešteje navedene številske izraze."""
	      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,)
	  

Na dokumentu temelječi rutini LibreOffice Basic Print in SUM sprejmeta spremenljivo število argumentov. Atributa Private in Public nimata učinka. Preverjanje vrste argumentov je zaradi jasnosti preskočeno.


	  Option Compatible ' "Standard.Scripting" module
	  Option Explicit
	      
	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
	      ''' Natisni seznam elementov spremenljivega obsega '''
	      ' sprejema vse pretvorljive argumente 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
	      ''' Vsota spremenljivega seznama števil '''
	      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()
	  

Podprite nas!