Defaultwert bei Attribut

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
T.T. Kreischwurst
User
Beiträge: 52
Registriert: Dienstag 2. Februar 2016, 10:56

Liebes Forum,

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... :shock:

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
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@T.T. Kreischwurst: und wo wird `apply` aufgerufen. Das wäre noch relevant.
BlackJack

@Sirius3: Das wird von der `ok()`-Methode aufgerufen.
Antworten