Spis treści

# Wywoływanie makr Basic z Pythona

Makra LibreOffice Basic można wywoływać ze skryptów Pythona, a w zamian można uzyskać znaczące funkcje, takie jak:

- możliwość prostego logowania za pomocą konsoli Trace biblioteki Access2Base,

- InputBox i MsgBox wyświetlają funkcje wejścia/wyjścia oparte na Basic, aby ułatwić programowanie w Pythonie,

- wywołania Xray przerywają wykonywanie skryptów Pythona, aby ułatwić kontrolę zmiennych.

Struktura skryptów API (Application Programming Interface) LibreOffice obsługuje międzyjęzykowe wykonywanie skryptów między językami Python i Basic lub innymi obsługiwanymi językami programowania. Argumenty mogą być przekazywane tam iz powrotem między wywołaniami, pod warunkiem, że reprezentują prymitywne typy danych rozpoznawane przez oba języki i przy założeniu, że środowisko skryptowe odpowiednio je konwertuje.

Zalecana jest znajomość standardowych modułów Pythona i funkcji API LibreOffice przed wykonaniem wywołań międzyjęzykowych z Pythona na Basic, JavaScript lub jakikolwiek inny silnik skryptowy.

Podczas uruchamiania skryptów języka Python z IDE (Integrated Development Environment) może nie być wbudowanego podstawowego mechanizmu LibreOffice. Unikaj wywołań Python-do-LibreOffice Basic w takich kontekstach. Jednak środowisko Pythona i UNO (Universal Networks Objects) są w pełni dostępne. Więcej informacji znajdziesz w artykule Konfigurowanie zintegrowanego środowiska programistycznego (IDE) dla Pythona.

## Pobieranie skryptów LibreOffice Basic

Makra programu LibreOffice Basic mogą być osobiste, udostępnione lub osadzone w dokumentach. Aby je wykonać, środowisko uruchomieniowe Pythona musi mieć zapewnione podstawowe lokalizacje makr. Implementacja interfejsu com.sun.star.script.provider.XScriptProvider umożliwia pobieranie skryptów wykonywalnych:

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

    		 def getBasicScript(macro='Main', module='Module1', library='Standard',
    		         isEmbedded=False) -> XScript:
    		     '''Chwyć obiekt skryptu Basic przed wywołaniem.'''
    		     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

## Wykonywanie skryptów LibreOffice Basic

Dokumentacja SDK (Software Development Kit) LibreOffice dla com.sun.star.script.provider.XScript szczegółowo opisuje konwencję wywoływania połączeń międzyjęzykowych. Wywołanie funkcji wymaga trzech tablic:

- pierwsza zawiera listę argumentów wywoływanej procedury

- druga identyfikuje zmodyfikowane argumenty

- trzecia przechowuje zwracane wartości

### Składnia Pythona

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

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

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

### Przykłady skryptów osobistych lub udostępnionych

Przykłady w sekcji Wejście i wyjście ekranu szczegółowo omawiają wywołania Pythona do Basic. Monitorowanie zdarzeń w dokumentach ilustruje użycie idiomu Pythona *args do drukowania zmiennej liczby parametrów w oknie dialogowym konsoli logowania Access2Base.

W czasie tworzenia można przerwać wykonywanie skryptu Pythona za pomocą rozszerzenia Xray w celu sprawdzenia właściwości i metod obiektów UNO. Debuger rozszerzeń APSO umożliwia introspekcję obiektów przy użyciu rozszerzeń Xray lub MRI.

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

### Przykłady osadzonych skryptów w dokumentach

W przypadku podstawowych funkcji programu LibreOffice, które akceptują zmienną liczbę argumentów, można użyć uproszczonej składni języka Python *args. Poniższe funkcje Pythona Print i SUM wywołują odpowiednie funkcje podstawowe Print i SUM przy użyciu wspomnianej funkcji getBasicScript. Obsługa błędów nie jest uwzględniona w kodzie.

    	  # -*- coding: utf-8 -*-
    	  from __future__ import unicode_literals

    	  def Print(*args):
    	      """Wypisuje określony ciąg znaków lub wyrażenie liczbowe w oknie dialogowym."""
    	      xScript = getBasicScript("Print", "Scripting", embedded=True)
    	      xScript.invoke((args), (), ())

    	  def SUM(*args):
    	      """SUM podanego wyrażenia liczbowego."""
    	      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,)

Podstawowe procedury LibreOffice Print i SUM oparte na dokumentach akceptują zmienną liczbę argumentów. Atrybuty Private lub Public nie działają. Sprawdzanie typu argumentów jest pomijane dla przejrzystości.

    	  Option Compatible ' "Standard.Scripting" module
    	  Option Explicit

    	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
    	      ''' Wyświetl listę pozycji o numerze zmiennej '''
    	      ' wszystkie konwertowalne argumenty CStr() są akceptowane
    	      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 to zmienna lista liczb '''
    	      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()

Tematy pokrewne

Wywoływanie skryptów Pythona z Basic

Przykłady programowania w Pythonie

Pomoc skryptów Pythona LibreOffice

Pomoc LibreOffice Basic