Event nur 3 mal ausführbar

Fragen zu Tkinter.
Antworten
Gwunderi
User
Beiträge: 22
Registriert: Sonntag 16. Juni 2013, 23:15

Guten Morgen zusammen,

Möchte eine Passwort-Abfrage, bei der man drei Versuche hat; nach der dritten falschen Angabe stoppt das Programm.
Solange ich das Programm im "Shell" ablaufen lasse, geht es mit der "while"-Schleife und i=0 / i +=1 / if i ==3: break (siehe ersten Code).

Code: Alles auswählen

passwort = ["Anna", "Berta"]
login = "x"
i = 0

while login not in passwort:
    login = input ("Wie heisst Du? ")
    i +=1
    if i == 3:
        break

if login in passwort:
    print ("Willkommen",login)
else:
    print ("Hau ab!")
Aber in tkinter (GUI) muss ich die Passwort-Eingabe mit einem "Event" prüfen lassen, z.B. Buttonklick oder Enter-Taste - und da kann ich doch nicht sagen: stopp das Programm nach dem dritten Buttonklick (allgemein nach dem 3. "Event"). Gibt es hier keine Möglichkeit, das Programm nach dem 3. Fehlversuch zu stoppen? (siehe zweiten Code)

Code: Alles auswählen

from tkinter import *
root = Tk()

Label(root, text="Gib Deinen Namen an: ").pack()

eingabe = Entry(root)
eingabe.pack()

def prüf(event):
    ausgabe.delete("0", END)
    if eingabe.get() == "Anna":
        ausgabe.insert(END, "Willkommen Anna")
    else:
        ausgabe.insert(END, "Hau ab!")
        eingabe.delete("0", END)

eingabe.bind("<Return>", prüf)

Label(root, text='Drück dann "Enter"').pack()

ausgabe = Entry(root)
ausgabe.pack()

root.mainloop()
P.S. Weiss ja nicht, ob es so viel Sinn macht, wenn man die App immer wieder erneut starten kann, aber es geht mir um's Prinzip.

Vielen Dank
Gwunderi
Mit dem PC geht alles viel schneller - nur dauert's halt etwas länger.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Guten Morgen Gwunderi,

in Deinem ersten Beispiel solltest Du i in einer for-Schleife hochzählen, dazu sind die nämlich da:

Code: Alles auswählen

def main():
    passwort = ["Anna", "Berta"]
    for _retry in range(3):
        login = input("Wie heisst Du? ")
        if login in passwort:
            break
    else:
        print("Hau ab!")
        return
    print("Willkommen",login)
    
if __name__ == '__main__':
    main()
Für Deine GUI-Programme solltest Du anfangen, objektorientiert zu programmieren. Du mußt Dir die Anzahl der Fehlversuche über die »prüf«-Aufrufe hinweg merken, und das geht am besten mit einer Instanzvariable.
Gwunderi
User
Beiträge: 22
Registriert: Sonntag 16. Juni 2013, 23:15

Sirius3 hat geschrieben: in Deinem ersten Beispiel solltest Du i in einer for-Schleife hochzählen, dazu sind die nämlich da:
Hallo Sirius

Da habe ich wieder mal was gelernt. Wusste nicht, dass man for-Schleifen auch "breaken" kann.
Und das "return" bricht die Ausführung einer Funktion ab, kannte ich auch noch nicht (bin noch Anfängerin). Deine Abfrage funktioniert somit nur innerhalb einer Funktion.

Stimmt das? Das "else" bezieht sich auf "for _retry in range(3)" und nicht auf "if login in passwort"?
Edit: Oder es bezieht sich doch auf beides: falls die Schleife nach drei Versuchen nicht abgebrochen wurde, print ... usw.
Für Deine GUI-Programme solltest Du anfangen, objektorientiert zu programmieren. Du mußt Dir die Anzahl der Fehlversuche über die »prüf«-Aufrufe hinweg merken, und das geht am besten mit einer Instanzvariable.
Weiss nicht mal recht, was "objektorientiert" bedeutet, oder was eine "Instanzvariable" ist. Aber es genügt mir vorläufig zu wissen, dass es eine Möglichkeit gibt, die ich noch nicht kenne (werde bestimmt noch darauf kommen). Nur dass ich nicht stundenlang umsonst mit meinen jetztigen Kenntnissen herumprobiere.

Herzlichen Dank
Gwunderi
Mit dem PC geht alles viel schneller - nur dauert's halt etwas länger.
Antworten