Basic Makros aus Python aufrufen

Sie k├Ânnen LibreOffice Basic-Makros aus Python-Skripten aufrufen und erhalten im Gegenzug folgende bemerkenswerte Funktionen:

Das Scripting-Framework der LibreOffice-Anwendungsprogrammierschnittstelle (API) unterst├╝tzt die Ausf├╝hrung von Skripten zwischen Python und Basic oder anderen unterst├╝tzten Programmiersprachen. Argumente k├Ânnen zwischen Aufrufen hin und her ├╝bergeben werden, sofern sie primitive Datentypen darstellen, die von beiden Sprachen erkannt werden, und vorausgesetzt, dass sie vom Scripting-Framework ordnungsgem├Ą├č konvertiert werden.

tip

Es wird empfohlen, sich mit den Python-Standardmodulen und den LibreOffice-API-Funktionen vertraut zu machen, bevor Sie Sprachaufrufe von Python an Basic, JavaScript oder eine andere Skript-Engine ausf├╝hren.


warning

Beim Ausf├╝hren von Python-Skripten in einer IDE (Integrated Development Environment) fehlt m├Âglicherweise die geschachtelte LibreOffice Basic-Engine. Vermeiden Sie in einem solchen Kontext Aufrufe von Python an LibreOffice Basic. Die Python-Umgebung und das Universal Networks Objects (UNO) sind jedoch vollst├Ąndig verf├╝gbar. Weitere Informationen finden Sie unter Einrichten einer integrierten IDE f├╝r Python.


LibreOffice Basic-Skripte abrufen

Grundlegende LibreOffice Makros k├Ânnen privat, gemeinsam oder in Dokumente eingebettet sein. Um sie auszuf├╝hren, muss die Python-Runtime mit Basic-Makro-Positionen versehen werden. Das Implementieren der Schnittstelle com.sun.star.script.provider.XScriptProvider erm├Âglicht den Abruf von ausf├╝hrbaren Skripten:


		 import uno
		 from com.sun.star.script.provider import Xscript
		     
		 def getBasicScript(macro='Main', module='Module1', library='Standard',
		         isEmbedded=False) -> XScript:
		     '''Grundlegendes Skript-Objekt vor dem Aufruf abrufen.'''
		     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
		 

LibreOffice Basic-Skripte ausf├╝hren

In der LibreOffice Software Development Kit (SDK)-Dokumentation f├╝r die com.sun.star.script.provider.XScript-Schnittstelle wird die Aufrufkonvention f├╝r Sprachaufrufe beschrieben. Der Aufruf von Funktionen erfordert drei Arrays:

Python-Syntax

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

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

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

Beispiele f├╝r private oder gemeinsam genutzte Skripte

Beispiele inEin-/Ausgabe auf dem Bildschirm beschreiben die Aufrufe von Python zu Basic. ├ťberwachen von Dokumentereignissen veranschaulicht die Verwendung der *args-Python-Sprache zum Drucken einer variablen Anzahl von Parametern in Access2Base im Dialog Protokollierungskonsole.

tip

At time of development you can interrupt Python script execution using Xray extension in order to inspect properties and methods of UNO objects. The APSO extension debugger allows object introspection using either Xray either MRI extensions.



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

Beispiele f├╝r eingebettete Skripte in Dokumenten

Die vereinfachte *args-Syntax von Python kann in Verbindung mit LibreOffice Basic-Routinen verwendet werden, die eine variable Anzahl von Argumenten akzeptieren. Unterhalb der Python-Funktionen Print und SUM werden die entsprechenden Gegenst├╝cke Print und SUM mit der oben genannten Funktion getBasicScript aufgerufen. Die Ausnahmebehandlung ist nicht detailliert.


	  # -*- coding: utf-8 -*-
	  from __future__ import unicode_literals
	      
	  def Print(*args):
	      """Gibt die angegebenen Zeichenfolgen oder numerischen Ausdr├╝cke in einem Dialog aus."""
	      xScript = getBasicScript("Print", "Scripting", embedded=True)
	      xScript.invoke((args), (), ())
	      
	  def SUM(*args):
	      """SUM des angegebenen Zahlenausdrucks."""
	      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,)
	  

Die Dokument-basierten LibreOffice Basic-Routinen Print und SUM akzeptieren eine variable Anzahl von Argumenten. Die Attribute Private oder Public haben keine Auswirkung. Die ├ťberpr├╝fung des Argumenttyps wird aus Gr├╝nden der ├ťbersichtlichkeit ├╝bersprungen.


	  Option Compatible ' "Standard.Scripting" module
	  Option Explicit
	      
	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
	      '''Artikelliste der Variablennummer drucken'''
	      ' alle konvertierbaren CStr()-Argumente werden akzeptiert
	      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 ist eine variable Liste von Zahlen '''
	      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()
	  

Bitte unterst├╝tzen Sie uns!