Login-Formular GUI Erstellung -

Fragen zu Tkinter.
Antworten
vitellinho
User
Beiträge: 13
Registriert: Dienstag 7. März 2023, 11:05

Hallo zusammen,

ich bin ein absoluter Anfänger in Sachen programmieren und versuche mir seit ein paar Wochen bereits python als erste Sprache selbstständig beizubringen.
Entschuldigt also jetzt schon bitte meine unübersichtliche Programmierweise, ich gib mir dennoch Mühe das ganze mit Klassen- und Objektzuteilungen etwas lesbar zu gestalten :roll:


Also... Einer meiner ersten Projekte war ein Login-Formular, welches ich über die Konsole ausgegeben habe. Das hat auch recht gut funktioniert:

Code: Alles auswählen

class Login_Formular: 

    username = "username"
    password = "password"
    login_u = "login_u"
    login_p = "login_p"
    p_again = "p_again"
    tries = 0

    def registration(self):
        while self.p_again != self.password:
            self.username = input("Gib hier einen neuen Benutzernamen ein: ")
            if len(self.username) < 8:
                print("Dein Benutzername ist ungültig. Beachte bitte die Anforderungen (mind. 8 Zeichen)")
            else:
                while self.p_again != self.password:
                    self.password = input("Gib hier dein neues Passwort ein: ")
                    if len(self.password) < 8: #mind. 8 Zeichen
                        print("Dein Passwort ist ungültig. Beachte bitte, dass du mindestens 8 Zeichen verwendest.")
                    elif not any(char.isdigit() for char in self.password): #Zahlen enthalten
                        print("Dein Passwort ist ungültig. Beachte bitte, dass du unter anderem auch Ziffern verwendest.")
                    elif not any(char.isalpha() for char in self.password): #Buchstaben enthalten
                        print("Dein Passwort ist ungültig. Beachte bitte, dass du unter anderem auch Buchstaben verwendest.")
                    elif not any(char.isupper() for char in self.password) or not any(char.islower() for char in self.password): #Groß- und Kleinbuchstaben enthalten
                        print("Dein Passwort ist ungültig. Beachte bitte, dass du unter anderem auch Groß- und Kleinbuchstaben verwendest.")
                    else:
                        while self.p_again != self.password:
                            self.p_again = input("Wiederhole dein Passwort: ")
                            if self.p_again == self.password:
                                print(" ")
                                break
                            else:
                                print(" ")
                                print("Die Passwörter stimmen leider nicht überein, probier es nochmal.")
                                pass

    def login(self):
        while True and self.tries < 3:
            self.tries += 1
            self.login_u = input("Benutzername: ")
            self.login_p = input("Passwort: ")
            if self.login_u == self.username and self.login_p == self.password:
                print("Du hast dich erfolgreich angemeldet.")
                exit()
            elif self.tries < 3:
                print(f"Eingabe des Benutzernamens oder Passworts ist fehlgeschlagen. Du hast noch {3 - self.tries} Versuche.")
            else:
                print(f"Anmeldung fehlgeschlagen. Dein Zugang ist gesperrt")
                exit()

login = Login_Formular()

login.registration()
login.login()
Nun versuche ich im nächsten Step, diesen Code in einer GUI durch tkinter zu übernehmen:

Code: Alles auswählen

import tkinter as tk 
from tkinter import ttk

root = tk.Tk()
root.geometry("700x400")
root.minsize(width=700, height=400)
root.maxsize(width=700, height=400)
root.title("Login-Formular")

new_username_proof = True
new_password_proof = True
error = None

for i in range(21):
    root.columnconfigure(i, weight=1)
    root.rowconfigure(i, weight=1)

def new_username():
    new_username_label = tk.Label(root, text="Neuer Benutzername: ", font=("Arial", 20))
    new_username_label.grid(row=7, column=8)

    new_username_input = ttk.Entry(root, width=15, font=("Arial", 20))
    new_username_input.grid(row=7, column=9)

def new_password():
    new_password_label = tk.Label(root, text="Neues Passwort: ", font=("Arial", 20))
    new_password_label.grid(row=9, column=8)

    new_password_input = ttk.Entry(root, width=15, font=("Arial", 20), show="*")
    new_password_input.grid(row=9, column=9)

def repeat_and_error():
    error = tk.Label(root, text=("Falsche Eingabe, beachte bitte die Anforderungen:\n \nBenutzername: mind. 8 Zeichen\nPasswort: mind. 8 Zeichen, Klein- und Großbuchstaben und Ziffern "), font=(16))
    error["justify"] = "left"
    
    repeat_password_label = tk.Label(root, text="Wiederhole dein Passwort: ", font=("Arial", 20))
    repeat_password_input = ttk.Entry(root, width=15, font=("Arial", 20), show="*")
    
    while False:
        if new_username_proof == False or new_password_proof == False:
            error.grid(row=14, column=9)
            break
        else:
            error.grid_remove()           
            repeat_password_label.grid(row=10, column=8)
            repeat_password_input.grid(row=10, column=9)
            break

def button_clicked():
    if len(new_password) < 8 or not any(char.isdigit() for char in new_password) or not any(char.isalpha() for char in new_password) or not any(char.isupper() for char in new_password):
        new_password_proof = False
    else:
        new_password_proof = True

    if len(new_username) < 8:
        new_username_proof = False
    else:
        new_username_proof = True

def button():
    button = ttk.Button(root, text="Bestätigen", command=button_clicked)
    button.grid(row=12, column=9, sticky="nswe")

def open_window():
    root.mainloop()

new_username()
new_password()
button()
repeat_and_error()

open_window()
Wie ihr seht bin ich nicht allzu weit gekommen.. Der erste Meilenstein, den ich erreichen wollte, war die fehlerfreie Ausgabe des error_codes (bei nicht erfüllten username / password Anforderungen) oder die Ausgabe des repeat_password Labels und Entry wenn die username und password Anforderungen erfüllt wurden. Leider stoße ich hier an meine Grenzen.

Hauptprobleme sind zum einen ständige Fehlermeldungen darüber, dass Variablen wie zB. 'error' nicht definiert wären, obwohl ich das im Konstrukt der Klasse getan habe und zum anderen, dass die 'error' Meldung bei mehrfacher Betätigung des Buttons 'Bestätigen' (aufgrund von mehrfacher hintereinander folgenden Fehleingaben) und einer anschließenden richtigen Eingabe des usernames und des passwords nicht mehr gelöscht wird. Heißt, es erscheinen dann die repeat_password Elemente, aber die 'error' Meldung bleibt.

Ich versuche seit über einer Woche mithilfe von Eigenrecherche oder ChatGPT die Fehler aus diesem Code raus zu arbeiten, aber leider ohne Erfolg. Umso mehr ich am Code geändert habe, desto schlimmer wurde es. Meine Vermutung ist, dass ich mich bzgl. der Klassen und Objekt Nutzung innerhalb des Codes etwas verhaspelt habe und jetzt vieles durcheinander geworfen habe..

Ich bin über jegliche Art an Kritik sowie Tipps und Tricks zu meinen Codes sehr dankbar !!!

VG
vitellinho
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Zu Deinem ersten Code:
Klassenvariablen sind kein Ersatz für Instanzvariablen, die werden in __init__ gesetzt. Die Defaultwerte sind auch mehr als merkwürdig. Nach dem Durchlaufen von __init__ sollten in allen Attributen sinnvolle Werte stehen. Da das __init__ fehlt, ist es eigentlich gar keine richtige Klasse, besser wäre es registration und login als einfache Funktionen zu implementieren. Man muß auch lernen, wann eine Klasse sinnvoll ist und wann nicht.
while-Schleifen, die nur loslaufen, wenn man Variablen mit Dummy-Werten belegt, sind eigentlich while-True-Schleifen, die an der passenden Stelle per `break` verlassen werden. Die äußeren zwei While-Schleifen sind zu groß. Dadurch ist der Code viel zu tief verschachtelt.
`exit` wird nirgends definiert. Das Programm sollte dadurch beendet werden, dass die main-Funktion verlassen wird, nicht durch irgeneinen Funktionsaufruf mitten im Code.
Man benutzt keine kryptischen Abkürzungen. Wenn man password meint, schreibt man nicht nur p.

Code: Alles auswählen

def registration():
    while True:
        username = input("Gib hier einen neuen Benutzernamen ein: ")
        if len(username) >= 8:
            break
        print("Dein Benutzername ist ungültig. Beachte bitte die Anforderungen (mind. 8 Zeichen)")

    while True:
        password = input("Gib hier dein neues Passwort ein: ")
        if len(password) < 8: #mind. 8 Zeichen
            print("Dein Passwort ist ungültig. Beachte bitte, dass du mindestens 8 Zeichen verwendest.")
        elif not any(char.isdigit() for char in password): #Zahlen enthalten
            print("Dein Passwort ist ungültig. Beachte bitte, dass du unter anderem auch Ziffern verwendest.")
        elif not any(char.isalpha() for char in password): #Buchstaben enthalten
            print("Dein Passwort ist ungültig. Beachte bitte, dass du unter anderem auch Buchstaben verwendest.")
        elif not any(char.isupper() for char in password) or not any(char.islower() for char in password): #Groß- und Kleinbuchstaben enthalten
            print("Dein Passwort ist ungültig. Beachte bitte, dass du unter anderem auch Groß- und Kleinbuchstaben verwendest.")
        else:
            break
    
    while True:
        password_again = input("Wiederhole dein Passwort: ")
        if password_again == password:
            break
        print("Die Passwörter stimmen leider nicht überein, probier es nochmal.")
    return username, password


def login(username, password):
    for tries in range(1, 4):
        login_username = input("Benutzername: ")
        login_password = input("Passwort: ")
        if login_username == username and login_password == password:
            print("Du hast dich erfolgreich angemeldet.")
            return True
        elif self.tries < 3:
            print(f"Eingabe des Benutzernamens oder Passworts ist fehlgeschlagen. Du hast noch {3 - tries} Versuche.")
    print(f"Anmeldung fehlgeschlagen. Dein Zugang ist gesperrt")
    return False


def main():
    username, password = registration()
    if not login(username, password):
        return
    print("hier gehts weiter")

if __name__ == "__main__":
    main()
Bei GUIs muß man zwangsläufig Klassen implementieren, weil man Zustand hat, der über das Ende der Methode hinaus gespeichert werden muß, denn alles was eine Funktion braucht, muß sie über ihre Argumente bekommen. Globale Variablen sollte man nicht benutzen.
Die Größe des Fensters ergibt sich aus dessen Inhalt, man gibt sie nicht fix vor.
Die Funktionen new_username und new_password sind unüblich, weil man alle GUI-Elemente in einer Funktion erzeugt.
In `button_clicked` versuchst Du die Länge von Funktionen zu ermitteln, das funktioniert natürlich nicht. Du willst ja den Inhalt des Entries benutzen.
Einfach Flags zu setzen funktioniert nicht, sondern Du muß an der Stelle die GUI-Elemente anpassen.
rows und columns fangen nicht bei 8 an, sondern bei 0.

Das ganze könnte so aussehen:

Code: Alles auswählen

import tkinter as tk 
from tkinter import ttk


class LoginFormular(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Login-Formular")

        tk.Label(self, text="Neuer Benutzername: ").grid(row=0, column=0)
        self.new_username = ttk.Entry(self, width=15)
        self.new_username.grid(row=0, column=1)

        tk.Label(self, text="Neues Passwort: ").grid(row=1, column=0)
        self.new_password = ttk.Entry(self, width=15, show="*")
        self.new_password.grid(row=1, column=1)

        tk.Label(self, text="Wiederhole dein Passwort: ", font=("Arial", 20)).grid(row=2, column=0)
        self.repeat_password = ttk.Entry(self, width=15, show="*")
        self.repeat_password.grid(row=2, column=1)

        self.error = tk.Label(self, text="")
        self.error["justify"] = "left"
        self.error.grid(row=3, column=0)

        button = ttk.Button(self, text="Bestätigen", command=self.button_clicked)
        button.grid(row=4, column=0, sticky="nswe")

    def button_clicked(self):
        password = self.new_password.get()
        username = self.new_username.get()
        repeat_password = self.repeat_password.get()
        if len(password) < 8 or not any(char.isdigit() for char in password) or not any(char.isalpha() for char in assword) or not any(char.isupper() for char in password):
            self.error["text"] = "Falsche Eingabe, beachte bitte die Anforderungen:\n \nBenutzername: mind. 8 Zeichen\nPasswort: mind. 8 Zeichen, Klein- und Großbuchstaben und Ziffern"
        
def main():
    root = LoginFormular()
    root.mainloop()

if __name__ == "__main__":
    main()
vitellinho
User
Beiträge: 13
Registriert: Dienstag 7. März 2023, 11:05

@Sirius3 Ich danke dir, hab echt viel gelernt durch deine Antwort.
vitellinho
User
Beiträge: 13
Registriert: Dienstag 7. März 2023, 11:05

Eine Frage habe ich aber noch, und zwar bin ich auch hier trotz Recherche im Internet nicht schlauer geworden:

Was hat es mit der ' super().__init__() ' auf sich? Habe bemerkt, dass ich eine Fehlermeldung bekomme, sobald ich den Code ohne diese ausführe. Verstehe aber leider nicht so ganz wieso bzw. wozu es gut ist.
Benutzeravatar
Dennis89
User
Beiträge: 1152
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

nur als kurze Info, weil es mir gerade zufällig aufgefallen ist. Im ersten Code von Sirius3 ist in Zeile 38 noch ein 'self'-Überbleibsel drin und in Zeile 40 müsste man eigentlich keinen 'f'-String verwenden, weil man keinen definierten Namen in den String einbindet, oder?

Im zweiten Code habe ich nur das 'asswort' entdeckt. Dass da Namen nicht genutzt werden, liegt sicherlich daran, dass man die Logik noch fertig schreiben muss.

@vitellinho Die Antwort auf deine Frage überlasse ich denjenigen die das sattelfester erklären können, weil sie es viel besser wissen, aber vielleicht kannst du folgendes besser lesen/verstehen

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk


class LoginFormular(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)

        tk.Label(self, text="Neuer Benutzername: ").grid(row=0, column=0)
        self.new_username = ttk.Entry(self, width=15)
        self.new_username.grid(row=0, column=1)

        tk.Label(self, text="Neues Passwort: ").grid(row=1, column=0)
        self.new_password = ttk.Entry(self, width=15, show="*")
        self.new_password.grid(row=1, column=1)

        tk.Label(self, text="Wiederhole dein Passwort: ", font=("Arial", 20)).grid(
            row=2, column=0
        )
        self.repeat_password = ttk.Entry(self, width=15, show="*")
        self.repeat_password.grid(row=2, column=1)

        self.error = tk.Label(self, text="")
        self.error["justify"] = "left"
        self.error.grid(row=3, column=0)

        button = ttk.Button(self, text="Bestätigen", command=self.button_clicked)
        button.grid(row=4, column=0, sticky="nswe")

    def button_clicked(self):
        password = self.new_password.get()
        username = self.new_username.get()
        repeat_password = self.repeat_password.get()
        if (
            len(password) < 8
            or not any(char.isdigit() for char in password)
            or not any(char.isalpha() for char in password)
            or not any(char.isupper() for char in password)
        ):
            self.error[
                "text"
            ] = "Falsche Eingabe, beachte bitte die Anforderungen:\n \nBenutzername: mind. 8 Zeichen\nPasswort: mind. 8 Zeichen, Klein- und Großbuchstaben und Ziffern"


def main():
    root = tk.Tk()
    root.title("Login-Formular")
    app = LoginFormular(root)
    app.pack()
    app.mainloop()


if __name__ == "__main__":
    main()
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
vitellinho
User
Beiträge: 13
Registriert: Dienstag 7. März 2023, 11:05

Danke dir, Dennis!
vitellinho
User
Beiträge: 13
Registriert: Dienstag 7. März 2023, 11:05

Ich bin jetzt soweit gekommen, das ich die erste Hälfte, also die Registrierung bis zur Eingabe des repeat_passwords und der dazu gehörigen Prüfung (password = repeat_password) fertig gestellt habe.
Hier mein Code soweit:

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk


class LoginFormular(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Login-Formular")

        tk.Label(self, text="Neuer Benutzername: ").grid(row=0, column=0)
        self.new_username = ttk.Entry(self, width=15)
        self.new_username.grid(row=0, column=1)

        tk.Label(self, text="Neues Passwort: ").grid(row=1, column=0)
        self.new_password = ttk.Entry(self, width=15, show="*")
        self.new_password.grid(row=1, column=1)

        self.repeat_password_label = tk.Label(self, text="")
        self.repeat_password_label.grid(row=2, column=0)
        self.repeat_password_entry = ttk.Entry(self, width=15, show="*")

        self.error1 = tk.Label(self, text="")
        self.error1["justify"] = "left"
        self.error1.grid(row=3, column=0)

        self.error2 = tk.Label(self, text="")
        self.error2["justify"] = "left"
        self.error2.grid(row=3, column=0)

        accept = ttk.Button(self, text="Bestätigen", command=self.accept_button_clicked)
        accept.grid(row=4, column=1, sticky="nswe")

        quit = ttk.Button(self, text="Beenden", command=self.quit_button_clicked)
        quit.grid(row=4 ,column=0, sticky="nswe")

    def quit_button_clicked(self):
        self.destroy()

    def accept_button_clicked(self):
        self.error1["text"] = ""
        self.error2["text"] = ""
        self.repeat_password_label["text"] = ""

        password = self.new_password.get()
        username = self.new_username.get()
        repeat_password = self.repeat_password_entry

        if len(username) < 8 or len(password) < 8 or not any(char.isdigit() for char in password) or not any(char.isalpha() for char in password) or not any(char.isupper() for char in password) or not any(char.islower() for char in password):
            self.error1["text"] = "Falsche Eingabe, beachte bitte die Anforderungen:\n \nBenutzername: mind. 8 Zeichen\nPasswort: mind. 8 Zeichen, Klein- und Großbuchstaben sowie Ziffern"
        elif len(username) > 8 or len(password) > 8 or any(char.isdigit() for char in password) or any(char.isalpha() for char in password) or any(char.isupper() for char in password):
            self.new_username.config(state="disabled")
            self.new_password.config(state="disabled")
            self.repeat_password_label["text"] = "Wiederhole dein Passwort: "
            repeat_password.grid(row=2, column=1)
        if len(repeat_password.get()) > 0:
            if repeat_password.get() != self.new_password.get():
                self.error2["text"] = "Die Passwörter stimmen nicht überein. Probier es nochmal."
            else:
                self.destroy()
                #ab hier gehts weiter

def main():
    root = LoginFormular()
    root.mainloop()

if __name__ == "__main__":
    main()
Ab hier komme ich aber wieder an meine Grenze. Ich habe mehrere Optionen zur Fortführung im Kopf, weiß aber erstens nicht ob das der richtige Denkansatz und und zweitens ob es überhaupt möglich ist. Dinge, wie ein 2. Window öffnen oder das 1. Window um alle Labels und Entrys bereinigen und dann wiederum als Benutzeroberfläche für die Login Maske zu verwenden, schwirren mir durch den Kopf. Zusätzlich überlege ich, ob es überhaupt möglich ist, dieses Login-Window über die bereits genutzte Klasse Login_Formular zu erschaffen, oder ob ich hierzu eine neue Klasse innerhalb des Codes erschaffen muss? Danke euch für weiteren Input!
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Ein Fenster zum Registrieren ist etwas anderes als ein Fenster für einen Login, zumal man selten erst das eine und dann das andere macht.
Du mußt beachten, dass es nur ein Tk-Hauptfenster geben darf, alle weiteren Fenster sind tk.Toplevel.
Was soll das Programm den eigentlich mal alles können?
vitellinho
User
Beiträge: 13
Registriert: Dienstag 7. März 2023, 11:05

Danke dir für die Antwort.

Um ehrlich zu sein soll das Programm nichts können. Es dient nur zur Übung. Es soll also im Endstadium nur prüfen, ob die im Login-Fenster eingegeben Daten mit den Registrierungsdaten übereinstimmen, und dann ein Label-Text "Anmeldung erfolgreich" ausgeben.

Was meinst du aber mit "zumal man selten erst das eine und dann das andere macht"?

LG
Benutzeravatar
__blackjack__
User
Beiträge: 13064
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@vitellinho: Eine erfolgreiche Registrierung ist in der Regel auch eine erfolgreiche Anmeldung, denn welchen Sinn hat es dem Benutzer nach der Registrierung die er *gerade* gemacht hat, noch mal eine Anmeldung hinterher zu schieben‽

Auch wenn es nur zur Übung dient muss das Programm etwas können, also es muss vorher irgendwie festgelegt werden was denn die Kriterien für eine *erfolgreiche* Übung sind. Sonst kann man den Lernerfolg nicht festmachen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
grubenfox
User
Beiträge: 422
Registriert: Freitag 2. Dezember 2022, 15:49

__blackjack__ hat geschrieben: Dienstag 14. März 2023, 15:22 @vitellinho: Eine erfolgreiche Registrierung ist in der Regel auch eine erfolgreiche Anmeldung, denn welchen Sinn hat es dem Benutzer nach der Registrierung die er *gerade* gemacht hat, noch mal eine Anmeldung hinterher zu schieben‽
Die Unterscheidung zwischen Registrierung und Anmeldung machen aber leider viele Foren. Stört mich auch immer wieder...
Eines davon (gerade mit dem frisch registrierten und dann angemeldetem Nutzer 'theori' geprüft) ist: https://www.python-forum.de :P
Benutzeravatar
__blackjack__
User
Beiträge: 13064
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@grubenfox: Bei Foren ist ja meistens noch eine E-Mail-Bestätigung dazwischen geschaltet, die man vielleicht nicht einfach so als Anmeldung akzeptieren sollte, denn der Klick auf den Link in der E-Mail muss ja nicht von der gleichen Person stammen, die die Registrierung gemacht hat. Derjenige kann eine falsche E-Mail angegeben haben, oder jemand hat die Mail abgefangen, oder auch Zugriff auf das Mailkonto. Da macht das schon Sinn sich noch mal die Zugangsdaten bestätigen zu lassen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
grubenfox
User
Beiträge: 422
Registriert: Freitag 2. Dezember 2022, 15:49

ist die dazwischen geschaltete E-Mail-Bestätigung mittlerweile nicht überall (nicht nur bei Foren) vorhanden? Jedenfalls bei Zugängen zu irgendwelchen Dienstleistungen die übers Internet erreichbar sind. Bei Anwendungen im lokalen Firmennetzwerk sieht es wohl anders aus... aber ich glaube wir schweifen hier etwas vom Thema ab. ;)
vitellinho
User
Beiträge: 13
Registriert: Dienstag 7. März 2023, 11:05

Jo dann hätten wir das auch geklärt .. ^^


Bin mittlerweile etwas weiter gekommen mit meinem Code, habe nur das Problem dass sich window2 immer 2x öffnet.
Ist mein Ansatz richtig?

UPDATE: Hab herausgefunden, dass es etwas mit der tk.Toplevel Funktion zutun hat. Sobald ich diese durch tk.Tk ersetze, schießt sich window1 und es öffnet sich window 2 wie gewollt. Lese aber überall, dass ich für solche Fälle tk.Toplevel nutzen soll. Bin etwas verwirrt :?:

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk


class LoginFormular():
    def __init__(self):
        self.window1 = tk.Tk()
        self.window1.title("Registrierung")

        tk.Label(self.window1, text="Neuer Benutzername: ").grid(row=0, column=0)
        self.new_username = ttk.Entry(self.window1, width=15)
        self.new_username.grid(row=0, column=1)

        tk.Label(self.window1, text="Neues Passwort: ").grid(row=1, column=0)
        self.new_password = ttk.Entry(self.window1, width=15, show="*")
        self.new_password.grid(row=1, column=1)

        self.repeat_password_label = tk.Label(self.window1, text="")
        self.repeat_password_label.grid(row=2, column=0)
        self.repeat_password_entry = ttk.Entry(self.window1, width=15, show="*")

        self.error1 = tk.Label(self.window1, text="")
        self.error1["justify"] = "left"
        self.error1.grid(row=3, column=0)

        self.error2 = tk.Label(self.window1, text="")
        self.error2["justify"] = "left"
        self.error2.grid(row=3, column=0)

        accept = ttk.Button(self.window1, text="Bestätigen", command=self.accept_button_clicked)
        accept.grid(row=4, column=1, sticky="nswe")

        quit = ttk.Button(self.window1, text="Beenden", command=self.quit_button_clicked)
        quit.grid(row=4 ,column=0, sticky="nswe")

        self.window1.mainloop()

    def quit_button_clicked(self):
        self.window1.destroy()

    def accept_button_clicked(self):
        self.x = 0
        self.error1["text"] = ""
        self.error2["text"] = ""
        self.repeat_password_label["text"] = ""

        password = self.new_password.get()
        username = self.new_username.get()
        repeat_password = self.repeat_password_entry

        if len(username) < 8 or len(password) < 8 or not any(char.isdigit() for char in password) or not any(char.isalpha() for char in password) or not any(char.isupper() for char in password) or not any(char.islower() for char in password):
            self.error1["text"] = "Falsche Eingabe, beachte bitte die Anforderungen:\n \nBenutzername: mind. 8 Zeichen\nPasswort: mind. 8 Zeichen, Klein- und Großbuchstaben sowie Ziffern"
        elif len(username) > 8 or len(password) > 8 or any(char.isdigit() for char in password) or any(char.isalpha() for char in password) or any(char.isupper() for char in password):
            self.new_username.config(state="disabled")
            self.new_password.config(state="disabled")
            self.repeat_password_label["text"] = "Wiederhole dein Passwort: "
            repeat_password.grid(row=2, column=1)
        if len(repeat_password.get()) > 0:
            if repeat_password.get() != self.new_password.get():
                self.error2["text"] = "Die Passwörter stimmen nicht überein. Probier es nochmal."
            else:
                self.x += 1
                self.window1.destroy()
                self.window2 = tk.Toplevel()
                self.window2.title("Login")

    def login(self):
        if self.x == 1:
            self.username_label = tk.Label(self.window2, text="Benutzername: ").grid(row=0, column=0)
            self.login_username = ttk.Entry(self.window2, width=15)
            self.password_label = tk.Label(self.window2, text="Passwort: ").grid(row=1, column=0)
            self.login_password = ttk.Entry(self.window2, width=15, show="*")

def main():
    login_formular = LoginFormular()

if __name__ == "__main__":
    main()
vitellinho
User
Beiträge: 13
Registriert: Dienstag 7. März 2023, 11:05

Update für mitlesende und interessierte, Code ist Fertig geworden. Sieht katastrophal aus, tut aber was es soll. Für Feedback immer dankbar!

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk


class LoginFormular():
    def __init__(self):
        self.window1 = tk.Tk()
        self.window1.title("Registrierung")

        tk.Label(self.window1, text="Neuer Benutzername: ").grid(row=0, column=0)
        self.new_username = ttk.Entry(self.window1, width=15)
        self.new_username.grid(row=0, column=1)

        tk.Label(self.window1, text="Neues Passwort: ").grid(row=1, column=0)
        self.new_password = ttk.Entry(self.window1, width=15, show="*")
        self.new_password.grid(row=1, column=1)

        self.repeat_password_label = tk.Label(self.window1, text="")
        self.repeat_password_label.grid(row=2, column=0)
        self.repeat_password_entry = ttk.Entry(self.window1, width=15, show="*")

        self.error1 = tk.Label(self.window1, text="")
        self.error1["justify"] = "left"
        self.error1.grid(row=3, column=0)

        self.error2 = tk.Label(self.window1, text="")
        self.error2["justify"] = "left"
        self.error2.grid(row=3, column=0)

        accept = ttk.Button(self.window1, text="Bestätigen", command=self.accept_button_clicked)
        accept.grid(row=4, column=1, sticky="nswe")

        quit = ttk.Button(self.window1, text="Beenden", command=self.quit_button_clicked)
        quit.grid(row=4 ,column=0, sticky="nswe")

        self.window1.mainloop()

    def quit_button_clicked(self):
        self.window1.destroy()

    def quit_button_clicked2(self):
        self.window2.destroy()

    def accept_button_clicked2(self):
        if self.new_username.get() != self.login_username.get() or self.new_password.get() != self.login_password.get():
            self.login_alert["text"] = "Anmeldung fehlgeschlagen!"
        else:                                                           
            self.login_alert["text"] = "Anmeldung erfolgreich!"         

    def accept_button_clicked(self):
        self.x = 0
        self.error1["text"] = ""
        self.error2["text"] = ""
        self.repeat_password_label["text"] = ""

        username = self.new_username.get()
        password = self.new_password.get()
        repeat_password = self.repeat_password_entry

        if len(username) < 8 or len(password) < 8 or not any(char.isdigit() for char in password) or not any(char.isalpha() for char in password) or not any(char.isupper() for char in password) or not any(char.islower() for char in password):
            self.error1["text"] = "Falsche Eingabe, beachte bitte die Anforderungen:\n \nBenutzername: mind. 8 Zeichen\nPasswort: mind. 8 Zeichen, Klein- und Großbuchstaben sowie Ziffern"
        elif len(username) > 8 or len(password) > 8 or any(char.isdigit() for char in password) or any(char.isalpha() for char in password) or any(char.isupper() for char in password):
            self.new_username.config(state="disabled")
            self.new_password.config(state="disabled")
            self.repeat_password_label["text"] = "Wiederhole dein Passwort: "
            repeat_password.grid(row=2, column=1)

        if len(repeat_password.get()) > 0:
            if repeat_password.get() != self.new_password.get():
                self.error2["text"] = "Die Passwörter stimmen nicht überein. Probier es nochmal."
            else:
                self.x += 1
                self.window2 = tk.Tk()
                self.window2.title("Login")
                self.window1.withdraw()

        if self.x == 1:
            self.login_alert = tk.Label(self.window2, text="")
            self.login_alert["justify"] = "left"
            self.login_alert.grid(row=3, column=0)

            self.username_label = tk.Label(self.window2, text="Benutzername: ").grid(row=0, column=0)
            self.login_username = ttk.Entry(self.window2, width=15)
            self.login_username.grid(row=0, column=1)

            self.password_label = tk.Label(self.window2, text="Passwort: ").grid(row=1, column=0)
            self.login_password = ttk.Entry(self.window2, width=15, show="*")
            self.login_password.grid(row=1, column=1)

            self.accept2 = ttk.Button(self.window2, text="Bestätigen", command=self.accept_button_clicked2)
            self.accept2.grid(row=4, column=1, sticky="nswe")

            self.quit2 = ttk.Button(self.window2, text="Beenden", command=self.quit_button_clicked2)
            self.quit2.grid(row=4, column=0, sticky="nswe")

def main():
    login_formular = LoginFormular()

if __name__ == "__main__":
    main()
Antworten