Loginprogramm- Fehlversuche zählen

Fragen zu Tkinter.
Antworten
timm4444
User
Beiträge: 51
Registriert: Samstag 1. August 2020, 14:11

Hallo zusammen,

ich möchte ein Loginprogramm für mein Computer schreiben und habe jetzt aber ein Problem: Ich habe den Code unten schon gemacht(aufs wesentliche gekürzt):

Code: Alles auswählen

from tkinter import *

root = Tk()
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.overrideredirect(1)
root.geometry("%dx%d+0+0" % (w, h))

root.configure(bg="dark blue")


w2 = Label(root, justify=LEFT, fg = "red", bg = "dark green", padx = 1000, font = "Helvetica 32 bold italic", text="This compter is locked").pack(side="left")
 
w22 = Label(root, bg = "dark blue", fg = "red", text="Benutzername").place(x=100, y=530, width=300, height=30)
w23 = Label(root, bg = "dark blue", fg = "red", text="Passwort").place(x=1150, y=530, width=300, height=30)



def PasswortCheck_BenutzerCheck():

   
   zahl = str(entryZahl.get())
   benutzer = str(entryBenutzer.get())

   if benutzer == "" and zahl == "":
      root.destroy()

   

   
entryZahl = Entry(master=root, bg="green")
entryBenutzer = Entry(master=root, bg="green")

PasswortÜberprüfen = Button(master=root, text="Bestätigen", command=PasswortCheck_BenutzerCheck)

entryZahl.place(x=1150, y=500, width=300, height=30)
entryBenutzer.place(x=100, y=500, width=300, height=30)
PasswortÜberprüfen.place(x=630, y=640, width=150, height=20)

root.bind("<Return>", lambda e: PasswortCheck_BenutzerCheck())

root.mainloop()


Jetzt möchte ich, dass nach drei Fehlversuchen etwas passiert, aber das bekomme ich nicht hin.
Ich habe es auch schon so probiert:

Code: Alles auswählen

from tkinter import *

root = Tk()
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.overrideredirect(1)
root.geometry("%dx%d+0+0" % (w, h))

root.configure(bg="dark blue")


w2 = Label(root, justify=LEFT, fg = "red", bg = "dark green", padx = 1000, font = "Helvetica 32 bold italic", text="This compter is locked").pack(side="left")
 
w22 = Label(root, bg = "dark blue", fg = "red", text="Benutzername").place(x=100, y=530, width=300, height=30)
w23 = Label(root, bg = "dark blue", fg = "red", text="Passwort").place(x=1150, y=530, width=300, height=30)

fehlversuche = 0

def PasswortCheck_BenutzerCheck():

   
   zahl = str(entryZahl.get())
   benutzer = str(entryBenutzer.get())
   if fehlversuche == 3:
      print("Aktion")
   elif benutzer == "" and zahl == "":
      root.destroy()
   else:
      fehlversuche = fehlversuche + 1

   
entryZahl = Entry(master=root, bg="green")
entryBenutzer = Entry(master=root, bg="green")

PasswortÜberprüfen = Button(master=root, text="Bestätigen", command=PasswortCheck_BenutzerCheck)

entryZahl.place(x=1150, y=500, width=300, height=30)
entryBenutzer.place(x=100, y=500, width=300, height=30)
PasswortÜberprüfen.place(x=630, y=640, width=150, height=20)

root.bind("<Return>", lambda e: PasswortCheck_BenutzerCheck())

root.mainloop()
Aber bekomme diese Fehlemeldung:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Tobias\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "C:\Users\Tobias\Desktop\python\.py\Computer Pin\offi.py", line 23, in PasswortCheck_BenutzerCheck
    if fehlversuche == 3:
UnboundLocalError: local variable 'fehlversuche' referenced before assignment
Ich habe auch schon viel rumgegoogelt und probiert, aber es hat nie richtig funktioniert.
Wie bekomme ich es hin, dass es funktioniert?
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine *-Importe, keine globalen Variablen und kein place.
Variablennamen werden generell klein geschrieben. Genauso wie Funktionen.
w2, w22 und w23 an None zu binden ist unsinnig, zumal die Variablen nie wieder gebraucht werden.
entry.get liefert schon einen String, den also nochmals in einen String zu verwandeln ist unnötig.
Eine Variable zahl zu nennen, deren Wert aber mit einer Zahl gar nichts zu tun hat, ist verwirrend.

Der Code mal aufgeräumt und von den schrecklichen Farben befreit:

Code: Alles auswählen

from functools import partial
import tkinter as tk

def check_user(root, entry_benutzer, entry_zahl, event=None):
   zahl = entry_zahl.get()
   benutzer = entry_benutzer.get()
   if benutzer == "" and zahl == "":
      root.destroy()
 

def main():
    root = tk.Tk()
    root.attributes('-fullscreen', True)

    frame = tk.Frame(root)

    tk.Label(frame, text="Benutzername").grid(row=1, column=0)
    entry_benutzer = tk.Entry(frame)
    entry_benutzer.grid(row=0, column=0)
    
    tk.Label(frame, text="Passwort").grid(row=1, column=1)
    entry_zahl = tk.Entry(frame)
    entry_zahl.grid(row=0, column=1)

    command = partial(check_user, root, entry_benutzer, entry_zahl)
    tk.Button(frame, text="Bestätigen", command=command).grid(row=2, column=0, columnspan=2)
    root.bind("<Return>", command)

    frame.pack(pady=300)
    tk.Label(root, fg = "white", bg = "dark green", font = "Helvetica 32 bold italic", text="This compter is locked").pack(fill=tk.X)
    root.mainloop()

if __name__ == "__main__":
    main()
Wenn Du jetzt noch die Anzahl der Versuche Dir merken willst, mußt Du Dir einen Zustand über das Ende der Funktion check_user hinaus merken. Dafür braucht man Klassendefinitionen. Wenn Du ein bißchen hier im Forum stöberst, wirst Du hunderte Beispiele dafür finden.
timm4444
User
Beiträge: 51
Registriert: Samstag 1. August 2020, 14:11

1. Das waren keine schreckllichen Farben.
2. Danke für die schnelle Antwort
timm4444
User
Beiträge: 51
Registriert: Samstag 1. August 2020, 14:11

Ich habe jetzt rumgeschaut und eine Klasse definiert, aber ich mache da irgendetwas falsch; ich bekomme immer die Fehlermeldung:

Code: Alles auswählen

UnboundLocalError: local variable 'fehlversuche' referenced before assignment
Wäre nett, wenn du mir ein Beitrag, wo dies erklärt ist verlinken würdest oder es direkt hier hinein schreibst.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du denn jetzt gemacht?
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo tim4444,
die Fehlermeldung ist immer noch die selbe wie in deinem ersten Beitrag.
Die Variable 'fehlversuche' muss in der Klasse definiert werden oder mit dem Aufruf an die Funktion / Methode übergeben werden.
Gruss Peter
timm4444
User
Beiträge: 51
Registriert: Samstag 1. August 2020, 14:11

@peterpy Ich habe das so gemacht:

Code: Alles auswählen

class fehlversuche:
   def __init__():
      fails = 0
   def fehlversuche_count():
      fails = fails + 1


def check_user(root, entry_benutzer, entry_zahl, event=None):
   zahl = entry_zahl.get()
   benutzer = entry_benutzer.get()
   if benutzer == "" and zahl == "":
      root.destroy()
   else:
      fehlversuche.fehlversuche_count()
Damit bekomme ich die Fehlermeldung.

Ich habe jetzt das erste mal mit Klassen gearbeitet; also bitte nachsichtig sein, wenn ich jetzt alles falsch gemacht habe. :)
Zuletzt geändert von timm4444 am Donnerstag 11. März 2021, 19:57, insgesamt 1-mal geändert.
timm4444
User
Beiträge: 51
Registriert: Samstag 1. August 2020, 14:11

@Sirius3 Das neue Design werde ich übernehmen, sehe aber nicht durch wie es funktioniert.
Mein Anliegen daher ist, ob du mir sagen kannst, wie ich die beiden Eingabefelder auseinander machen kann, da ich dazwischen noch ein Bild einfügen möchte.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Klassen-Programmierung lernt man nicht durch Raten.
Du brauchst nicht irgendeine Klasse, sondern eine Klasse für dein GUI, mit einer Methode check_user und Attributen für die Entries und eben der Anzahl der Fehlversuche.

Wenn Du dazwischen noch ein Bild möchtest, dann mußt Du halt das Bild im Grid zwischen den beiden Eingabefeldern platzieren.
timm4444
User
Beiträge: 51
Registriert: Samstag 1. August 2020, 14:11

@Sirius3 Kannst du den Code für die Klasse hier hinein scheiben?
timm4444
User
Beiträge: 51
Registriert: Samstag 1. August 2020, 14:11

Oder irgendwie einen Beitrag verlinken, der soetwas beschreibt.
Benutzeravatar
Dennis89
User
Beiträge: 1121
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

bitteschön: https://docs.python.org/3/tutorial/classes.html

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
timm4444
User
Beiträge: 51
Registriert: Samstag 1. August 2020, 14:11

Danke :)
Antworten