ich habe neulich ein merkwürdiges Phänomen bei einem Attribut festgestellt, von dem ich hoffe, dass ihr es mir erklären könnt:
Ich habe eine Klasse, die von tkinter.simpledialog erbt und - Überraschung! - ein Dialogfenster implementiert. Diese Klasse wird von einer anderen Controller-Klasse instanziiert. Das fragliche Attribut wird im __init__ mit None vorbelegt und später dann von der apply() Methode des Dialogs mit einem Wert (der Nutzeringabe im Dialog) versehen. So weit, so funktionierend.
Wenn ich nun in der Controller Klasse das Dialog-Objekt instanziiere und nach der Nutzereingabe das Attribut abfrage, wird mir NICHT der gesetzte Wert der Nutzeingabe angezeigt, sondern der Defaultwert...
Hier der Code (die Controllerklasse hab ich nicht angehängt, da der relevante Code eigtl. nur aus print(RequestPassword-Objekt.password) besteht.
Code: Alles auswählen
class RequestPassword(tkinter.simpledialog.Dialog):
def __init__(self, master):
tkinter.simpledialog.Dialog.__init__(self, master)
self.password = None
def body(self, master):
''' Two entries and labels needed here: enter password and repeat password. '''
tk.Label(master, text="Geben Sie ein Passwort ein:").pack(
padx=(3,0),
pady=3
)
self.pw_entry = tk.Entry(master, width=50, show='*')
self.pw_entry.pack(padx=(3,0), pady=3)
tk.Label(master, text="Wiederholen Sie das Passwort:").pack(
padx=(3,0),
pady=3
)
self.pw_repeat = tk.Entry(master, width=50, show='*')
self.pw_repeat.pack(padx=(3,0), pady=3)
return self.pw_entry
def buttonbox(self):
''' Default button box is overridden, becauce we don't want to allow aborting the dialogue here. (Would mess up config settings)'''
box = tk.Frame(self)
w = tk.Button(box, text="OK", width=10, command=self.ok, default=tk.ACTIVE)
w.pack(side=tk.LEFT, padx=5, pady=5)
self.bind("<Return>", self.ok)
box.pack()
def apply(self):
''' Set the entered strings as attributes.'''
self.password = self.pw_entry.get()
def validate(self):
''' Make sure both entries are matching and none is empty. '''
if self.pw_entry.get() != self.pw_repeat.get():
tkinter.messagebox.showerror("Fehler", "Passwörter stimmen nicht berein!")
return
elif self.pw_repeat.get() == '':
tkinter.messagebox.showerror("Fehler", "Leeres Passwort ist nicht erlaubt!")
return
else:
return 1