Pythonscripts in Base nutzen - Anregungen gesucht

Wie zu jeder neuen LibreOffice-Version wird von mir beständig das Base-Handbuch überarbeitet und erweitert. Ich fange jetzt damit an, für die Version 2402 das Makrokapitel um ein Kapitel mit Python zu erweitern. Ich habe bisher lediglich notiert, wie der Kontakt zur Datenbank erfolgt und Abfragen gestellt werden können. Den jeweils aktuellen Arbeitsstand lade ich immer auf meine Homepage Datenbanken hoch. Dort ist rechts ein Ordner "Letzte Uploads" → "Bearbeitungsversionen".
Da für mich Python ein Neuland ist kann es sein, dass einiges nicht so ganz stimmig ist - vor allem von der Ausdrucksweise (nennt sich das nun Bibliothek oder Datei oder …).
Dewegen: Rückmeldungen und Anregungen besonders zu den letzten Seiten des Kapitels 09_Makros sind sehr willkommen.

Ohne groß auf die Python-Sprache an sich einzugehen, sondern nur zum Umgang mit syntaktisch gültigem Python-Code als LibreOffice Makros:

  • Eine “Bibliothek” im Kontext von LO Makros ist einfach nur ein Unterverzeichns von /Scripts/python/. Das kann auch ein Symlink zu einem beliebigen Projektverzeichnis einer IDE sein.
  • Ein Modul ist eine Textdatei mit Python-Code und der Endung .py.
  • Eine Routine, die im rechten Teil des Makro-Dialogs als Bestandteil eines Modul angezeigt wird ist ein def-Block. Es gibt keinen Unterschied zw. Sub und Function. Jede Makro-Routine ist eine def.
  • Im Unterschied zu Basic, kann man mit einer globalen Variable
    g_exportedScripts = main, show_dialog1, config_helper
    eine LIste von Routinen festlegen, die im Makro-DIalog zur Auswahl stehen sollen… Alle anderen Routinen werden dann ausgeblendet. Ohne diese Variable werden alle Routinen angezeigt. Die Variable sollte unter allen defs erscheinen weil der Parser von oben nach unten arbeitet und die aufgelistetetn defs sonst unbekannte Symbole sind.
  • Im Unterschied zu StarBasic, ignoriert Python nicht die Anzahl der übergebenen Argumente.
    Wenn Du in StarBasic von einem Formular oder Kontrollelement die folgende Routine aufrufst: Sub Main(), dann wird immer ein Event-Struct mit übergeben. Die Definition von Main() erwartet aber überhaupt kein Argument, was aber nicht weiter auffällt solange der Code nicht versucht, auf ein übergebenes, aber nicht deklariertes Argument zuzugreifen. Falls Du in Python ein übergebenes Argument ignorieren willst, dann musst du das Argument als optional markieren: def Main(*args):' erlaubt ein optionales Array von zusätzlichen Argumenten oder eben keines wie in VB die Deklaration eines ParamArrays.

Und jetzt noch, was alle Python-Coder eh wissen:
Ein beliebiger Block in Python (z.B. ein def-Block) wird eingeleitet mit einem Schlüsselwort, die einleitende Zeile endet mit einem Doppelpunkt, nach dem Doppelpunkt beginnt Zeilen mit Einrückung. Der Block endet mit der Einrückung.

Also schreibe ich grundsätzlich besser nichts von “Bibliothek” sondern spreche die einzelne Datei mit “Modul” an und das, was ich in Basic als “Prozedur” bezeichne wird hier zur “Routine”.

Bleib bei “Prozedur” wenn Du das für Basic so genannt hast.
Ich habe meine paar globalen Python-Module in Bibliotheken organisiert. Die heißen pyCalc, pyWriter, pyDBA und pyAWT damit sie im Makro/Event-Dialog von ähnlichen Basic-Bibliotheken zu unterscheiden sind.

Wie hast Du denn die Bibliotheken erstellt? Nicht dass ich das im Moment für meine eine *.py-Datei benötigte, aber das ist doch richtig verstanden: Eine Bibliothek enthält dann ohne weiteres mehrere *.py-Dateien?

Lege das Verzeichnis …/4/user/Scripts/python/pyDBA an, lege Python-Dateien rein, und schon hast Du eine Bibliothek “pyDBA” im Makro-DIalog. Der ganze XML-Quark mit xlb und xlc-Dateien zur Makro-Registrierung entfällt komplett. Wenn ein Modul mal keine Prozeduren anzeigt obwohl welche drin sind, dann kompiliert es nicht wg. Syntaxfehlern.

1 Like

Da würde ich »Funktion« statt »Routine« schreiben, innerhalb einer »class« wären es dann »Methoden« aber das sind dann schon Details die hier noch nicht so wichtig sind.

1 Like