Obsah

# Volání maker Basicu z Pythonu

Ze skriptů Pythonu lze volat makra jazyka LibreOffice Basic a díky tomu lze využívat mimo jiné následující vlastnosti:

- možnost jednoduchého protokolování pomocí konzole Trace knihovny Access2Base,

- funkce Basicu InputBox a MsgBox se vstupy a výstupy, usnadňující vývoj v Pythonu,

- volání Xray, které přeruší spuštěný skript Pythonu a umožní prozkoumat proměnné.

Za tím účelem skriptovací rozhraní z rozhraní pro programování aplikací (API) LibreOffice umožňuje spouštění skriptů mezi Pythonem a Basicem, případně mezi dalšími podporovanými programovacími jazyky. Ve voláních lze předávat oběma směry argumenty za předpokladu, že se jedná o primitivní datové typy rozpoznatelné oběma jazyky a že je skriptovací rozhraní umí správně převést.

Pokud chcete používat volání mezi Pythonem a Basicem, JavaScriptem či jiným jazykem, je vhodné, abyste měli odpovídající znalost standardních modulů Pythonu a API pro LibreOffice.

Pokud spouštíte skripty Pythonu z integrovaného vývojového prostředí (IDE), může tam Basic pro LibreOffice chybět. Proto se v takovém případě volání Basicu z Pythonu vyhněte. Prostředí pro Python a Universal Networks Objects (UNO) však budou plně dostupné. Další informace naleznete v části Nastavení IDE pro Python.

## Získávání skriptů jazyka LibreOffice Basic

Makra jazyka LibreOffice Basic mohou být osobní, sdílená nebo vložená v dokumentech. Chcete-li je spouštět, je nutné jazyku Python poskytnout informaci o jejich umístění. Toho dosáhnete pomocí rozhraní com.sun.star.script.provider.XScript:

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

    		 def getBasicScript(macro='Main', module='Module1', library='Standard',
    		         isEmbedded=False) -> XScript:
    		     '''Získá před spuštěním objekt se skriptem Basicu.'''
    		     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

## Spouštění skriptů jazyka LibreOffice Basic

Podrobnosti o pravidlech volání mezi jazyky popisuje dokumentace sady LibreOffice Software Development Kit (SDK) pro rozhraní com.sun.star.script.provider.XScript. Volání funkcí vyžadují tři pole:

- prvním je seznam argumentů volané funkce

- druhé určuje změněné argumenty

- ve třetím jsou uloženy návratové hodnoty

### Syntaxe Pythonu

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

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

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

### Příklady osobních nebo sdílených skriptů

Volání Basicu z Pythonu přibližují příklady v části Vstup a výstup na obrazovku. Část Sledování událostí v dokumentu ilustruje využití výrazu Pythonu *args k výpisu proměnlivého počtu parametrů do dialogového okna s protokolováním z knihovny Access2Base.

Během vývoje můžete přerušit vykonávání skriptu Pythonu pomocí rozšíření Xray. Poté budete schopni zkoumat vlastnosti a metody objektů UNO. Prozkoumat objekty pomocí rozšíření Xray nebo MRI umožňuje ladicí nástroj z rozšíření APSO.

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

### Příklady skriptů vložených v dokumentu

Pro funkce jazyka LibreOffice Basic, které akceptují proměnlivý počet argumentů, lze použít zjednodušenou syntaxi Pythonu *args. Níže uvedené funkce Pythonu Print a SUM volají odpovídající funkce Basicu Print a SUM, a to pomocí výše zmíněné funkce getBasicScript. V kódu není uvažováno zpracování chyb.

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

    	  def Print(*args):
    	      """Vypíše zadaný řetězec nebo číselný výraz do dialogového okna."""
    	      xScript = getBasicScript("Print", "Scripting", embedded=True)
    	      xScript.invoke((args), (), ())

    	  def SUM(*args):
    	      """Sečte zadaný číselný výraz."""
    	      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,)

V dokumentu vložené funkce Basicu Print a SUM akceptují proměnlivý počet argumentů. Atributy Private nebo Public nemají žádný význam. Pro přehlednost je vynechána kontrola typu argumentů.

    	  Option Compatible ' "Standard.Scripting" module
    	  Option Explicit

    	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
    	      ''' Vypíše seznam proměnlivého počtu položek '''
    	      ' možné jsou všechny argumenty, které lze převést funkcí CStr()
    	      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
    	      ''' Sečte seznam proměnlivého počtu čísel '''
    	      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()

Související témata

Volání skriptů Pythonu z Basicu

Příklady programování v Pythonu

Nápověda pro skripty Pythonu v LibreOffice

Nápověda LibreOffice Basic