Vsebina

# Klicanje makrov Basic s Pythonom

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

- enostavna zmožnost beleženja iz konzole Trace knjižnice Access2Base,

- zaslonski V/I funkciji InputBox in MsgBox, ki temeljita na Basicu in poenostavita razvoj v Pythonu,

- klici Xray, ki prekinjajo izvajanje skripta Python kot pomoč za proučevanje spremenljivk.

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.

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.

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:

- prvi izpiše seznam argumentov klicanega podprograma

- drugi identificira spremenjene argumente

- tretji hrani vrnjene vrednosti

### 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.

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

Podobne teme

Klicanje skriptov Python iz Basica

Primeri programov v Pythonu

Pomoč LibreOffice za skripte v jeziku Python

Pomoč za LibreOffice Basic