Hallo @pstoelzg
Vielen Dank - und ich habe mich wahrscheinlich sehr undeutlich ausgedrückt. Ich werde es nun etwas genauer Versuchen.
Was wir wollen:
Wir haben bereits eine geeignete Vorlage erstellt mit deren Hilfe ein neues Dokument erzeugt wird. In das dadurch neu zu erstellende Dokument sind eine ganze Menge an Daten einzugeben Da es sich dabei um abhängige Daten handelt, werden diese Teils aus anderen Dokumenten/Datenbanken etc ausgelesen
Der Ablauf ist eigentlich dem eines Datenwizards nicht unähnlich. Schritt für Schritt werden vom User Daten eingetragen und auf der Eingabe basierend andere, relevante Daten in andere Felder/Tabs/Seiten des Wizards eingetragen. Wird am Ende dieser Wizard geschlossen, und die gesamten Daten werden dann in das eigentiche Dokument (die *.ods-Datei) eingetragen.
=> also in Kürze der Ablauf:
1. Neue Datei per Vorlage starten
2. Tkinter-Formular (Wizard) anzeigen
3. User gibt dort die Kundennummer ein, woraufhin automatisch all dessen Stammdaten (u.a.) eingetragen und alle weiteren Seiten des Tkinter-Formulars (Wizards) gefüllt werden. Auf den weiteren Seiten sind weitere Daten zu bestätigen...
Fragen:
Wo muss ich das Makro einhängen, damit der Wizard gleich zu Beginn (aber nur bei der Dokumentenerzeugung) startet? Ich weiß aus der LibreOffice-Hilfe, dass es unter Extras>Anpassen die entsprechenden Events gibt, aber welcher ist der Richtige - meine Vermutung "Neues Dokument"?
Ich habe ein stark vereinfachtes Tkinter-Formular zum Testen des Vorhabens erstellt. Der Aufruf unter Python selbst funktioniert einwandfrei, aber in der Laufzeitumgebung von LibreOffice tritt ein Fehler auf.

- Fehleranzeige beim Start der Vorlage
- macrofehler.png (17.31 KiB) 5309 mal betrachtet
Hier die Datei
formulartest.py, die im entsprechenden Verzeichnis für die Makromodule gespeichert ist:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! Dies ist nur ein Testmodul !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
"""
import unohelper
import locale
import os
import ttk # enthaelt Tkinter als ttk.Tkinter
tk = ttk.Tkinter
ENC = locale.encodings.codecs.lookup(locale.getdefaultlocale()[1]).name
class Kunde(object):
def __init__(self):
self.nr = ""
self.name = ""
self.vorname = ""
def __unicode__(self):
return u"[%s] %s %s" % (self.nr, self.name, self.vorname)
def __str__(self):
return self.__unicode__().encode(ENC)
def run():
_window_ = tk.Tk()
_window_.title("Kundendaten")
_window_.geometry("400x100")
_body_ = tk.Frame(_window_)
class Model(Kunde):
def __init__(self):
Kunde.__init__(self)
self._nummer_ = tk.StringVar()
self._nummer_.set("2KP259TKX") # FIXME: TESTPHASE
self._name_ = tk.StringVar()
self._name_.set("Meier") # FIXME: TESTPHASE
self._vorname_ = tk.StringVar()
self._vorname_.set("Josef") # FIXME: TESTPHASE
def transfer(self):
self.nr = self._nummer_.get()
self.name = self._name_.get()
self.vorname = self._vorname_.get()
# logging falls noetig (interner Aufruf von __str__())
print self
_window_.quit()
mydata = Model()
# Kundennummer
tk.Label(_body_, text="KuNr.:").grid(row=1, column=0)
txtKunr = tk.Entry(_body_)
txtKunr.config(textvariable=mydata._nummer_)
txtKunr.grid(row=1, column=1)
# Kundenname
tk.Label(_body_, text="Name:").grid(row=2, column=0)
txtName = tk.Entry(_body_)
txtName.config(textvariable=mydata._name_)
txtName.grid(row=2, column=1)
# Kundenvorname
tk.Label(_body_, text="Vorname:").grid(row=3, column=0)
txtVorname = tk.Entry(_body_)
txtVorname.config(textvariable=mydata._vorname_)
txtVorname.grid(row=3, column=1)
# Buttons
_ok_ = tk.Button(_body_,
text="OK",
command=mydata.transfer)
_cancel_ = tk.Button(_body_,
text="CANCEL",
command=_window_.quit)
_ok_.grid(row=4, column=1)
_cancel_.grid(row=4, column=0)
_body_.grid()
_window_.mainloop()
# FIXME:
# schreibe die Daten an passender Stelle in die
# Datei ein:
# 1. Spalte 2.Spalte
# 1. Zeile: Kundennummer: ________
#
# 3. Zeile: Name: ________
# 4. Zeile: Vorname: ________
#
try:
doc = XSCRIPTCONTEXT.getDocument()
sheet = doc.Sheets.getByName("Tabelle1")
cellNummer = sheet.getCellByPosition(1, 2)
cellNummer.String = mydata.nr
cellName = sheet.getCellByPosition(3, 2)
cellName.String = mydata.name
cellVorname = sheet.getCellByPosition(4, 2)
cellVorname.String = mydata.vorname
except NameError:
pass
return mydata.nr, mydata.name, mydata.vorname
g_exportedScripts = run,
# Test des Pythoncodes
if __name__ == "__main__": run()