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

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

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

tip

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


warning

Κατά την εκτέλεση δεσμών ενεργειών Python από ολοκληρωμένο περιβάλλον ανάπτυξης (IDE), η ενσωματωμένη μηχανή Basic του 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()
	  

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