Inhalte
Index 🔎︎

# Basic Makros aus Python aufrufen

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

- Einfache Protokollierungsfunktionen aus der Access2Base-Bibliothek Trace-Konsole,

- Bildschirm-E/A-Funktionen InputBox und MsgBox, die auf Basic basieren, um die Python-Entwicklung zu vereinfachen,

- Xray ruft eine Unterbrechung der Python-Skriptausführung auf, um die Überprüfung von Variablen zu erleichtern.

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.

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.

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

LibreOffice Basic-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:
    		     '''Ruft das Basic-Skript-Objekt vor dem Aufruf ab.'''
    		     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:

- das erste listet die Argumente der aufgerufenen Routine auf

- das zweite identifiziert modifizierte Argumente

- der dritte speichert die Rückgabewerte

### Python-Syntax

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

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

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

### Beispiele für private oder gemeinsam genutzte Skripte

Ein-/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.

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

Verwandte Themen

Python-Skripte aus Basic aufrufen

Python-Programmierbeispiele

LibreOffice Python-Skripte Hilfe

LibreOffice Basic-Hilfe