Indhold

# Kald Basic-makroer fra Python

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

- Enkle logging-funktioner fra Access2Base-bibliotekets Sporings-konsol

- InputBox og MsgBox-skærm-I/O funktioner er baseret på Basic for at lette Python-udvikling

- Xray-kald afbryder Python script-udførsel for at hjælpe med at inspicere variable.

LibreOffice Application Programming Interface (API)s rammer for scripts understøtter mellemsproglig udførelse af scripts mellem Python og Basic, eller for den sags skyld med andre understøttede programmeringssprog. Argumenter kan videregives frem og tilbage på tværs af kald, forudsat at de repræsenterer primitive datatyper, som begge sprog genkender, og under den antagelse af scripting-rammerne konverterer dem på passende måde.

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

Når du kører Python-scripts fra et integreret udviklingsmiljø (IDE = Integrated Development Environment), kan den LibreOffice-indlejrede Basic-motor være fraværende. Undgå Python-til-LibreOffice Basic-kald til den sammenhæng. Python-miljøet og Universal Networks Objects (UNO) er fuldt tilgængelig. Se mere information på Opsætning af en 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 forsynet med Basic-makroernes placeringer. Implementering af brugerfladen com.sun.star.script.provider.XScriptProvider tillader, at af eksekverbare scripts genfindes:

    		 import uno
    		 from com.sun.star.script.provider import Xscript

    		 def getBasicScript(macro='Main', module='Module1', library='Standard',
    		         isEmbedded=False) -> XScript:
    		     '''Grib Basic-script objekt før kald.'''
    		     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

## Udfør 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:

- den første oplister argumenterne i den kaldte rutine

- den anden indentificerer ændrede argumenter

- den tredje lagrer returværdierne

### Python-syntaks

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

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

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

### Eksempler på personlige eller delte scripts

Eksempler i input/output til skærm forklarer Python-til-Basic-kald . Overvågning af Dokumenthændelser illustrerer brugen af *args Python-idiom til udskrivning af et varierende antal parametre til Access2Base-konsolens logningsdialog.

Under udviklingen kan du afbryde udførelsen 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 sammen med LibreOffice Basic-rutiner, som accepterer et varierende antal argumenter. Under Print og SUM kalder Python-funktioner deres Basic-modparter 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 af det specificerede taludtryk."""
    	      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 og SUM accepterer et varierende antal argumenter. Attributterne Private eller Public (delte) 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 er en variabelliste over 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()

Relaterede emner

Kalde Python-scripts fra Basic

Python programmeringseksempler

Hjælp til LibreOffice Pythonscripts

LibreOffice Basic Hjælp

Støt os venligst!