Isi
Indeks 🔎︎

# Memanggil Makro Basic dari Python

Anda dapat memanggil makro Basic LibreOffice dari skrip Python, dan fitur-fitur penting dapat diperoleh seperti:

- Fasilitas pencatatan sederhana dari pustaka konsol Trace Access2Base,

- Fungsi I/O tampilan InputBox dan MsgBox berdasarkan Basic untuk mempermudah pengembangan Python,

- Pemanggilan Xray mengganggu eksekusi skrip Python untuk membantu menginspeksi variabel.

LibreOffice Application Programming Interface (API) Scripting Framework mendukung eksekusi skrip antar-bahasa antara Python dan Basic, atau bahasa pemrograman lain yang didukung untuk hal tersebut. Argumen dapat dioperkan bolak balik lintas panggilan, asalkan mereka mewakili tipe data primitif yang dikenali kedua bahasa tersebut, dan dengan asumsi bahwa Scripting Framework mengubahnya dengan tepat.

Disarankan untuk memiliki pengetahuan tentang modul standar Python dan fitur API LibreOffice sebelum melakukan panggilan antar bahasa dari Python ke Basic, JavaScript atau bahasa lainnya.

Ketika menjalankan skrip Python dari Lingkungan Pengembangan Terpadu (IDE), mungkin mesin BASIC bersarang LibreOffice tidak ada. Hindari pemanggilan Python ke LibreOffice Basic jika konteksnya seperti itu. Namun lingkungan Python dan Universal Networks Objects (UNO) tersedia sepenuhnya. Silakan merujuk Mengatur IDE Terintegrasi untuk Python untuk informasi lebih lanjut.

## Mendapatkan Skrip Basic LibreOffice

Makro LibreOffice Basic dapat berdiri sendiri, dibagikan, atau tertanam dalam dokumen. Untuk menjalankannya, runtime Python perlu disediakan dengan lokasi makro Basic. Dengan mengimplementasikan antarmuka com.sun.star.script.provider.XScriptProvider memungkinkan pengambilan skrip yang dapat dieksekusi:

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

    		 def getBasicScript(macro='Main', module='Module1', library='Standard',
    		         isEmbedded=False) -> XScript:
    		     '''Mengambil skrip objek Basic sebelum pengaktifan.'''
    		     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

## Mengeksekusi Skrip LibreOffice Basic

Dokumentasi Kit Pengembangan Aplikasi (SDK) LibreOffice untuk antarmuka com.sun.star.script.provider.XScript menjelaskan tentang kaidah untuk pemanggilan antar bahasa. Aktivasi fungsi membutuhkan 3 array:

- yang pertama, daftar argumen dari routine yang dipanggil

- yang kedua, mengidentifikasi argumen yang dimodifikasi

- yang ketiga, menyimpan nilai kembalian

### Sintaks Python

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

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

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

### Contoh Skrip Personal atau Bersama

Contoh dalam Input/Output ke Layar menjelaskan detil pemanggilan fungsi Python ke Basic. Event Monitoring Dokumen mengilustrasikan penggunaan idiom *args Python untuk mencetak sejumlah parameter variabel ke dialog konsol log Access2Base.

Saat pengembangan Anda dapat menginterupsi eksekusi skrip Python menggunakan ekstensi XRay untuk menginspeksi properti dan method dari objek UNO. Ekstensi pengawakutu ASPO memungkinkan introspeksi objek menggunakan ekstensi Xray atau MRI.

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

### Contoh Skrip Tertanam dalam Dokumen

Sintaks Python *args yang disimplifikasi dapat digunakan sebagai konjungsi dengan routine LibreOffice Basic yang menerima sejumlah variabel argumen. Di bawah ini fungsi Cetak dan SUM Python memanggil rekan Basic Cetak dan SUM mereka, menggunakan fungsi getBasicScript yang tersebut di atas. Penanganan exception tidak dijelaskan.

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

    	  def Print(*args):
    	      """Menampilkan ekspresi string atau angka yang ditentukan dalam kotak dialog."""
    	      xScript = getBasicScript("Print", "Scripting", embedded=True)
    	      xScript.invoke((args), (), ())

    	  def SUM(*args):
    	      """SUM (menjumlahkan) ekspresi angka yang ditentukan."""
    	      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,)

Fungsi berbasis dokumen LibreOffice Basic Cetak dan SUM menerima sejumlah variabel argumen. Atribut Privat atau Publik tidak berpengaruh. Pengecekan jenis argumen dilewati untuk kejelasan.

    	  Option Compatible ' "Standard.Scripting" module
    	  Option Explicit

    	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
    	      ''' Cetak daftar item variabel angka'''
    	      ' semua argumen CStr() yang dapat dikonversi, diterima
    	      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 (menjumlahkan) daftar variabel angka '''
    	      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()

Topik Terkait

Memanggil Skrip Python dari Basic

contoh pemrograman Python

Bantuan Skrip Python LibreOffice

LibreOffice Basic Help