Κλήση μακροεντολών Basic από Python

Μπορείτε να καλέσετε τις μακροεντολές LibreOffice Basic από δέσμες ενεργειών Python και μπορούν να ληφθούν σημαντικά χαρακτηριστικά όπως:

Το Πλαίσιο δέσμης ενεργειών του LibreOffice Διασύνδεση προγραμματισμού εφαρμογών (API) υποστηρίζει τη διαγλωσσική εκτέλεση σεναρίων μεταξύ Python και Basic ή άλλες υποστηριζόμενες γλώσσες προγραμματισμού για αυτό το θέμα. Τα ορίσματα μπορούν να διαβιβαστούν πέρα δώθε σε κλήσεις, υπό την προϋπόθεση ότι αντιπροσωπεύουν πρωτογενείς τύπους δεδομένων που αναγνωρίζουν και οι δύο γλώσσες και υποθέτοντας ότι το Πλαίσιο Σεναρίων τα μετατρέπει κατάλληλα.

tip

Συνιστάται η γνώση των τυπικών αρθρωμάτων Python και των χαρακτηριστικών API του LibreOffice πριν την εκτέλεση διαγλωσσικών κλήσεων από Python σε Basic, JavaScript ή οποιονδήποτε άλλο μηχανισμό δεσμών ενεργειών.


warning

Όταν εκτελούνται σενάρια Python από ένα ολοκληρωμένο περιβάλλον ανάπτυξης (IDE), η ενσωματωμένη βασική μηχανή του LibreOffice μπορεί να απουσιάζει. Αποφύγετε τις κλήσεις Python προς Basic του LibreOffice σε τέτοια περιβάλλοντα. Ωστόσο, το περιβάλλον Python και τα Universal Networks Objects (UNO) είναι πλήρως διαθέσιμα. Ανατρέξτε στο Ρύθμιση ενός ολοκληρωμένου IDE για Python για περισσότερες πληροφορίες.


Ανάκτηση των δεσμών ενεργειών Basic του LibreOffice

Οι μακροεντολές Basic του LibreOffice μπορεί να είναι προσωπικές, κοινόχρηστες, ή ενσωματωμένες σε έγγραφα. Για να τις εκτελέσετε, ο χρόνος εκτέλεσης Python χρειάζεται να παρέχεται με τοποθεσίες μακροεντολών Basic. Η υλοποίηση της διεπαφής com.sun.star.script.provider.XScriptProvider επιτρέπει την ανάκτηση των εκτελέσιμων δεσμών ενεργειών:


		 import uno
		 from com.sun.star.script.provider import Xscript
		     
		 def getBasicScript(macro='Main', module='Module1', library='Standard',
		         isEmbedded=False) -> XScript:
		     '''Πάρτε το αντικείμενο δέσμης ενεργειών Basic πριν την κλήση.'''
		     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
		 

Εκτέλεση δεσμών ενεργειών Basic του LibreOffice

Η τεκμηρίωση της εργαλειοθήκης ανάπτυξης λογισμικού (SDK) του LibreOffice για τη διεπαφή com.sun.star.script.provider.XScript δίνει λεπτομέρειες της σύμβασης κλήσης για διαγλωσσικές κλήσεις. Η κλήση των συναρτήσεων απαιτεί τρεις πίνακες:

Σύνταξη Python

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

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

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

Παραδείγματα προσωπικών ή κοινόχρηστων δεσμών ενεργειών

Παραδείγματα στο Είσοδος/Έξοδος σε οθόνη περιγράφουν κλήσεις χρήσης Python σε Basic. Η παρακολούθηση συμβάντων εγγράφου δείχνει τη χρήση των *args του ιδιώματος Python για να εκτυπώσει μεταβλητό αριθμό παραμέτρων στον διάλογο κονσόλας σύνδεσης Access2Base.

tip

Κατά την ανάπτυξη μπορείτε να διακόψετε την εκτέλεση της δέσμης ενεργειών Python χρησιμοποιώντας την επέκταση Xray για να ελέγξετε ιδιότητες και μεθόδους των αντικειμένων UNO. Η αποσφαλμάτωση της επέκτασης APSO επιτρέπει την ενδοσκόπηση χρησιμοποιώντας είτε Xray, είτε επεκτάσεις MRI.



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

Παραδείγματα ενσωματωμένων δεσμών ενεργειών σε έγγραφα

*argsΗ απλοποιημένη σύνταξη Python μπορεί να χρησιμοποιηθεί σε συνδυασμό με τις ρουτίνες Basic του LibreOffice που δέχονται μεταβλητό αριθμό ορισμάτων. Κάτω από τις συναρτήσεις Python Print και SUM καλούνται οι αντίστοιχες τους Basic Print και SUM, χρησιμοποιώντας την προαναφερερόμενη συνάρτηση getBasicScript. Ο χειρισμός εξαιρέσεων δεν παρατίθεται.


	  # -*- coding: utf-8 -*-
	  from __future__ import unicode_literals
	      
	  def Print(*args):
	      """Εμφανίζει τις καθορισμένες συμβολοσειρές ή αριθμητικές εκφράσεις σε πλαίσιο διαλόγου."""
	      xScript = getBasicScript("Print", "Scripting", embedded=True)
	      xScript.invoke((args), (), ())
	      
	  def SUM(*args):
	      """SUM την καθορισμένη έκφραση αριθμού."""
	      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,)
	  

Οι ρουτίνες με βάση το έγγραφο της Basic του LibreOffice Print και SUM δέχονται μεταβλητό αριθμό ορισμάτων. Τα γνωρίσματα Private ή Public δεν έχουν κανένα αποτέλεσμα. Ο έλεγχος τύπου ορισμάτων παραλείπεται για σαφήνεια.


	  Option Compatible ' "Standard.Scripting" module
	  Option Explicit
	      
	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
	      ''' Εκτύπωση καταλόγου στοιχείων μεταβλητού αριθμού '''
	      ' όλα τα μετατρέψιμα ορίσματα 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
	      ''' SUM είναι κατάλογος μεταβλητών αριθμών '''
	      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()
	  

Παρακαλούμε, υποστηρίξτε μας!