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 eingebettete 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

Zum Zeitpunkt der Entwicklung k├Ânnen Sie die Ausf├╝hrung von Python-Skripten mithilfe der Erweiterung Xray unterbrechen, um die Eigenschaften und Methoden von UNO-Objekten zu ├╝berpr├╝fen. Der Debugger der APSO-Erweiterung erm├Âglicht die Inspektion von Objekten mit R├Ântgen- oder MRT-Erweiterungen.



	  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!