Danke @EyDu: Das Programm reagiert vollkommen wie erwartet, nur optisch nicht.
Hier die *setup* - Methode im *Presenter* (MVP):
Code: Alles auswählen
def setup(self, *eventargs, **presets):
'''
... hier code ausgelassen, der nur die Widgets erzeugt (Views)
'''
self.view.bind_all("<Control-x>", self.presenter.close)
self.view.btn_close.bind("<Button-1>", self.presenter.close)
self.view.bind_all("<Control-s>", self.presenter.create)
self.view.btn_save.bind("<Button-1>", self.presenter.create)
self.view.btn_save.bind("<Return>", self.presenter.create)
'''
...
'''
###
# Hier die *create* - Methode
def create(self, *eventargs):
"""Der uebergeordnete Presenter/Controller ruft diese
Methode auf.
Tests:
1) alle noetigen Felder vorhanden?
2) handelt es sich um ein Duplikat?
Test ok => _create_dataset
:param eventargs:
:return:
"""
feld = self.view.get_values()
if not (feld["nachname"] or \
feld["vorname"] or \
feld["geschlecht"] or \
feld["klasse"]):
tkMessageBox.showerror("ERROR",
u"Nachname, Vorname, Klasse und Geschlecht nötig")
return 'break'
try:
schueler = Schueler.select().where(
Schueler.nachname==feld["nachname"],
Schueler.vorname==feld["vorname"],
Schueler.geschlecht==feld["geschlecht"],
Schueler.spitzname==feld["spitzname"],
Schueler.klasse==feld["klasse"],
Schueler.zweig==feld["zweig"],
Schueler.gebdat==feld["geburtstag"]
).get()
# Warnung, der Schueler existiert bereits
self.app.view.write_statusinfo(
2,
u"Schüler existiert bereits [ID=%s]!" % (schueler.id,))
except peewee.DoesNotExist:
self._create_dataset(feld)
self.listview.remove_filter()
###
# eigentliche Speicherungsmethode
def _create_dataset(self, werte):
self.presenter.schueler = Schueler.create(
nachname=werte["nachname"],
vorname=werte["vorname"],
geschlecht=werte["geschlecht"],
klasse=werte["klasse"],
heimantrag=werte["heimantrag"],
zweig=werte["zweig"],
gebdat=werte["geburtstag"],
eintritt=werte["eintritt"],
austritt=werte["austritt"],
sonstiges=werte["sonstiges"])
# View anpassen
if werte["geschlecht"] in ["W", "w"]:
self.app.view.write_statusinfo(
1, u"Schülerin eingetragen:")
self.app.view.write_statusinfo(
2, u"%s, %s [id: %s]" % (werte["nachname"],
werte["vorname"],
self.presenter.schueler.id))
else:
self.app.view.write_statusinfo(
1, u"Schüler eingetragen:")
self.app.view.write_statusinfo(
2, u"%s, %s [id: %s]" % (werte["nachname"],
werte["vorname"],
self.presenter.schueler.id))
self.view.ent_nachname.focus_set()
@BlackJack: Warum kann man einen Callback nicht mit *bind* anhängen? Wenn man MVP umzusetzen will ist das doch gar nicht anders möglich. Der View erstellt die ganzen Widgets, der Presenter kümmert sich um die Funktionalität, dh. er weist dem Widget nachträglich den Callback zu.