Ich habe ein Hauptfenster in dem man über einen Button ein Eingabefenster(Toplevel) öffnen kann.
An das Eingabefenster ist ein <Destroy> Event gebunden und an die Entries jeweils ein <FocusOut> Event.
Es kommt vor, dass ein Nutzer beim Füllen des letzten Feldes den Fokus nicht mehr wechselt und die Methode,
die an das Widget über ein Event gebunden ist, nicht mehr ausgeführt wird.
Ich dachte nun, dass das Feld beim schließen des Fenster ebenfalls den Fokus verlert und so die Methode doch noch
ausgeführt wird. Aber es scheint so nicht zu funktionieren.
Wie kann ich garantieren, dass auch die letzte Eingabe sicher abgeschlossen und die entsprechende Methode ausgeführt wird?
Eine 'trace('w', ...)' möchte ich vermeiden.
Code: Alles auswählen
import tkinter as tk
from tkinter import ttk
class MainWindow(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.button_edit = ttk.Button(self,
text="Edit",
command=lambda: DataWindow(self))
self.button_edit.grid(row=0, column=0, )
class DataWindow(tk.Toplevel):
def __init__(self, parent):
tk.Toplevel.__init__(self, parent)
self.transient(parent)
self.parent = parent
self.entry_exducer_diam = ttk.Entry(self, textvariable=tk.StringVar())
self.entry_exducer_tip_diam = ttk.Entry(self, textvariable=tk.StringVar())
self.entry_exducer_diam.grid(row=0, column=0)
self.entry_exducer_tip_diam.grid(row=1, column=0)
### event bindings ###
self.bind('<Destroy>', lambda event: self._on_window_closed())
self.entry_exducer_diam.bind('<FocusOut>',
lambda event: self._on_exducer_diam_changed())
self.entry_exducer_tip_diam.bind('<FocusOut>',
lambda event: self._on_exducer_tip_diam_changed())
def _on_window_closed(self):
# bevor geschlossen wird soll eine der beiden unten aufgeführten Methoden
# ausgeführt werden, je nachdem welches Entry den Fokus zuletzt hatte
print('window closed')
def _on_exducer_diam_changed(self):
# soll ebenfalls ausgeführt werden, wenn fenster geschlossen wird und
# entry_exducer_diam den Fokus hatte
print('exducer diameter changed')
def _on_exducer_tip_diam_changed(self):
# soll ebenfalls ausgeführt werden, wenn fenster geschlossen wird und
# entry_exducer_tip_diam den Fokus hatte
print('exducer tip diameter changed')
if __name__ == '__main__':
MainWindow().mainloop()