Passwort Generatir

Code-Stücke können hier veröffentlicht werden.
Antworten
ereetzer
User
Beiträge: 9
Registriert: Samstag 24. September 2022, 13:08

Hallo,

möchte gerne meine erstes Programm in Python vorstellen.
Ich habe früher (vor etwa 8 Jahren oder so, etwas mit Delphi (Pascal) programmiert, daher Vorkenntnisse.

Was habt Ihr an Verbessungsvorschlägen evtl. Was könnte man noch implementieren? Mein Denglisch bitte nicht berücksichtigen :-) Was habe ich falsch gemacht? Was geht besser/schneller/anders etc.?

Von der Obbjektorientierung/Fenstererstellung habe ich jetzt beim ersten Projekt mal abgesehen.

Danke für Eure Infos.

Es sind 4 Bilder im Code, zu finden mit img_***, die einfach löschen und die Zugriffe darauf, dann läuft das auch bei Euch.
import tkinter
import tkinter as tk
import random
import string
from tkinter import Tk, messagebox, Canvas
import itertools
from idlelib.tooltip import Hovertip
from datetime import datetime

# Globals
programm_name = "Passwort Generator"


def check_for_passwort_staerke(passwort):
if int(len(passwort) < int(6)):
return "schwach"
elif (int(len(passwort) > int(12)) and
any(ch in string.ascii_lowercase for ch in passwort) and
any(ch in string.ascii_uppercase for ch in passwort) and
any(ch in string.punctuation for ch in passwort) and
any(ch.isdigit() for ch in passwort)):
return "stark"
else:
return "mittel"


def delete_same_characters_after_each_other(tmpstr):
ergebnis = "".join(c[0] for c in itertools.groupby(tmpstr))
return ergebnis


def delete_characters_from_string(passwort, welche_zeichen):
# zeichen = "!§$%&/()=?´´\}][{"
ergebnis = passwort.translate({ord(i): None for i in welche_zeichen})
return ergebnis


def copy_to_clipboard(passwort):
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append(passwort)
r.destroy()


def ueberpruefe_passwort(passwort):
# überprüfen ob Zahlen enthalten sind
if var_zahlen.get():
if not any(p in passwort for p in string.digits):
fehler_zahlen = {None}
else:
fehler_zahlen = ""
else:
fehler_zahlen = ""
# überprüfe, ob kleine Buchstaben enthalten sind
if var_kleine_buchstaben.get():
if not any(p in passwort for p in string.ascii_lowercase):
fehler_kleine_buchstaben = {None}
else:
fehler_kleine_buchstaben = ""
else:
fehler_kleine_buchstaben = ""
# überprüfen ob grosse Buchstaben enthalten sind
if var_grosse_buchstaben.get():
if not any(p in passwort for p in string.ascii_uppercase):
fehler_grosse_buchstaben = {None}
else:
fehler_grosse_buchstaben = ""
else:
fehler_grosse_buchstaben = ""
# überprüfen ob Satzzeichen enthalten sind
# Zeichen als Sonderzeichen/Satzzeichen definiert: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
if var_satzzeichen.get():
if not any(p in passwort for p in string.punctuation):
fehler_satzzeichen = {None}
else:
fehler_satzzeichen = ""
else:
fehler_satzzeichen = ""
# überprüfen um Umlaute enthalten sind
if var_umlaute.get():
if not any(p in passwort for p in "äÄüÜöÖß"):
fehler_umlaute = {None}
else:
fehler_umlaute = ""
else:
fehler_umlaute = ""

ist_passwort_ok = not (fehler_zahlen or fehler_kleine_buchstaben or fehler_grosse_buchstaben or
fehler_satzzeichen or fehler_umlaute)
return ist_passwort_ok


def passwort_erzeugen():
time_start = datetime.now()
try:
# noinspection PyUnusedLocal
test = int(str(entry_anzahl_zeichen_minimal.get()))
# noinspection PyUnusedLocal
test = int(str(entry_anzahl_zeichen_maximal.get()))
except:
messagebox.showerror("Fehler", "es wurde keine Zahl bei minimale oder maximale Zeichen angegeben")
return
passwort_laenge_minimal = int(entry_anzahl_zeichen_minimal.get())
passwort_laenge_maximal = int(entry_anzahl_zeichen_maximal.get())
if passwort_laenge_maximal < passwort_laenge_minimal:
messagebox.showerror("Fehler", "die maximale Länge muss die minimale Passwortlänge überschreiten")
return
if not var_zahlen.get() and not var_kleine_buchstaben.get() and not var_grosse_buchstaben.get() and not \
var_satzzeichen.get() and not var_umlaute.get():
messagebox.showerror("Fehler", "es muss mindestens 1 Option angeklickt sein")
return
if passwort_laenge_minimal < 1:
messagebox.showerror("Fehler", "Die minimale Anzahl an Zeichen muss '1' betragen")
passwort_laenge = random.randint(passwort_laenge_minimal, passwort_laenge_maximal)
passwort = ""
# 1 ausgewählt, 0 = nicht ausgewählt
if var_kleine_buchstaben.get():
# passwort = random.choice(string.ascii_lowercase)
passwort += string.ascii_lowercase
if var_grosse_buchstaben.get():
# passwort += random.choice(string.ascii_uppercase)
passwort += string.ascii_uppercase
if var_satzzeichen.get():
# passwort += random.choice(string.punctuation)
passwort += string.punctuation + string.punctuation
if var_zahlen.get():
# passwort += random.choice(string.digits)
passwort += string.digits + string.digits + string.digits
if var_umlaute.get():
passwort += "äÄüÜöÖß"
# noinspection PyUnusedLocal
# noinspection PyUnusedLocal
erzeugtes_passwort = "".join(random.choice(passwort) for i in range(passwort_laenge))
if ueberpruefe_passwort(erzeugtes_passwort):
# eventuelle doppelte Zeichen die hintereinander kommen, löschen
if var_doppelte_zeichen.get():
erzeugtes_passwort = delete_same_characters_after_each_other(erzeugtes_passwort)
entry_erzeugtes_passwort.delete(0, tk.END)
entry_erzeugtes_passwort.insert(0, erzeugtes_passwort)
label_passwort_laenge.configure(text="Passwortlänge: " + str(len(erzeugtes_passwort)))
else:
pass
# Zeichen ausschliessen, wenn eingestellt
if not entry_zeichen_ausschliessen.get() == "":
zeichen = entry_zeichen_ausschliessen.get()
erzeugtes_passwort = delete_characters_from_string(erzeugtes_passwort, zeichen)
entry_erzeugtes_passwort.delete(0, tk.END)
entry_erzeugtes_passwort.insert(0, erzeugtes_passwort)
label_passwort_laenge.configure(text="Passwortlänge: " + str(len(erzeugtes_passwort)))
else:
pass
if len(erzeugtes_passwort) < int(entry_anzahl_zeichen_minimal.get()):
passwort_erzeugen()
return
else:
entry_erzeugtes_passwort.delete(0, tk.END)
entry_erzeugtes_passwort.insert(0, erzeugtes_passwort)
label_passwort_laenge.configure(text="Passwortlänge: " + str(len(erzeugtes_passwort)))
print(erzeugtes_passwort)
passwort_staerke = check_for_passwort_staerke(erzeugtes_passwort)
if passwort_staerke == "schwach":
label_erzeugtes_passwort.configure(bg="red")
entry_erzeugtes_passwort.configure(bg="red")
if passwort_staerke == "mittel":
label_erzeugtes_passwort.configure(bg="yellow")
entry_erzeugtes_passwort.configure(bg="yellow")
if passwort_staerke == "stark":
label_erzeugtes_passwort.configure(bg="green")
entry_erzeugtes_passwort.configure(bg="green")
Hovertip(label_erzeugtes_passwort, passwort_staerke)
else:
# wenn nicht ok, funktion erneut aufrufen, solange bis ok
passwort_erzeugen()
time_end = datetime.now()
time_delta = time_end - time_start
execution_time = str(time_delta.total_seconds())
statusbar.configure(text="Verstrichene Zeit in Sekunden: " + execution_time)


# ======================================================================================================================
# Hauptfenster einrichten===============================================================================================
# ======================================================================================================================
root = tk.Tk()
img_passwort_generator = tk.PhotoImage(file="password-key-16.png")
img_passwort_generator = tk.PhotoImage(file="")
img_schliesse_programm = tk.PhotoImage(file="close_program.png")
img_kopiere_zu_zwischenablage = tk.PhotoImage(file="clipboard_plus.png")
root.title(programm_name)
root.geometry("400x440")
# root.minsize(width=400, height=250) # Mindestbreite und höhe einstellen
# root.maxsize(width=1620, height=800) # Maximalbreite und höhe einstellen
root.resizable(width=False, height=False) # Fensterbreite und höhe kann nicht verstellt werden
root.iconphoto(False, img_passwort_generator)
# Frame über gesamtes Hauptfenster einrichten
frame = tk.Frame(root)
frame.pack(fill=tk.BOTH, expand=True)

labelframe_einstellungen = tk.LabelFrame(frame, text="Einstellungen zum generieren", font="Arial 10 bold")
labelframe_einstellungen.place(x=10, y=10, width=380, height=250)

# Widgets um festzulegen aus welchen Zeichen das Passwort bestehen soll
var_zahlen = tk.IntVar()
checkbox_mit_zahlen = tk.Checkbutton(labelframe_einstellungen, text="Zahlen berücksichtigen", variable=var_zahlen)
checkbox_mit_zahlen.place(x=10, y=10)
checkbox_mit_zahlen.select()
var_kleine_buchstaben = tk.IntVar()
checkbox_mit_buchstaben_klein = tk.Checkbutton(labelframe_einstellungen, text="kleine Buchstaben berücksichtigen",
variable=var_kleine_buchstaben)
checkbox_mit_buchstaben_klein.place(x=10, y=30)
checkbox_mit_buchstaben_klein.select()
var_grosse_buchstaben = tk.IntVar()
checkbox_mit_buchstaben_gross = tk.Checkbutton(labelframe_einstellungen, text="grosse Buchstaben berücksichtigen",
variable=var_grosse_buchstaben)
checkbox_mit_buchstaben_gross.place(x=10, y=50)
checkbox_mit_buchstaben_gross.select()
var_satzzeichen = tk.IntVar()
checkbox_mit_satzzeichen = tk.Checkbutton(labelframe_einstellungen, text="Satzzeichen berücksichtigen",
variable=var_satzzeichen)
checkbox_mit_satzzeichen.place(x=10, y=70)
checkbox_mit_satzzeichen.select()
var_umlaute = tk.IntVar()
checkbox_mit_sonderzeichen_normal = tk.Checkbutton(labelframe_einstellungen,
text="Umlaute berücksichtigen (äÄ, üÜ, öÖ)", variable=var_umlaute)
checkbox_mit_sonderzeichen_normal.place(x=10, y=90)

label_anzahl_zeichen_minimal = tk.Label(labelframe_einstellungen, text="Anzahl Zeichen minimal: ")
label_anzahl_zeichen_minimal.place(x=10, y=120, width=150)
entry_anzahl_zeichen_minimal = tk.Entry(labelframe_einstellungen)
entry_anzahl_zeichen_minimal.place(x=180, y=120)
label_anzahl_zeichen_maximal = tk.Label(labelframe_einstellungen, text="Anzahl Zeichen maximal: ")
label_anzahl_zeichen_maximal.place(x=10, y=140, width=150)
entry_anzahl_zeichen_maximal = tk.Entry(labelframe_einstellungen)
entry_anzahl_zeichen_maximal.place(x=180, y=140)

var_doppelte_zeichen = tk.IntVar()
checkbox_doppelte_zeichen = tk.Checkbutton(labelframe_einstellungen, text="es dürfen keine Zeichen doppel "
"nacheinander vorkommen",
variable=var_doppelte_zeichen)
checkbox_doppelte_zeichen.place(x=10, y=170)
checkbox_doppelte_zeichen.select()

label_zeichen_ausschliessen = tk.Label(labelframe_einstellungen, text="Zeichen ausschliessen: ")
label_zeichen_ausschliessen.place(x=10, y=200)
entry_zeichen_ausschliessen = tk.Entry(labelframe_einstellungen)
entry_zeichen_ausschliessen.place(x=180, y=200, width=105)
entry_zeichen_ausschliessen.insert(0, "{}´`*~^°")
button_zeichen_ausschliessen_delete = tk.Button(labelframe_einstellungen, compound=tk.LEFT,
image=img_schliesse_programm,
command=lambda: entry_zeichen_ausschliessen.delete(0, tk.END))
button_zeichen_ausschliessen_delete.place(x=285, y=200, width=20, height=20)

# Voreinstellung für minimale und maximale Zeichen
entry_anzahl_zeichen_minimal.insert(0, "8")
entry_anzahl_zeichen_maximal.insert(0, "10")


# Widgets im Hauptfenster erzeugen
label_erzeugtes_passwort = tk.Label(frame, text="Passwort:")
label_erzeugtes_passwort.place(x=10, y=260)

entry_erzeugtes_passwort = tk.Entry(frame, font="bold")
entry_erzeugtes_passwort.place(x=10, y=280, width=380)
label_passwort_laenge = tk.Label(frame, text="")
label_passwort_laenge.place(x=10, y=302)

button_kopiere_zu_zwischenablage = tk.Button(frame, text=" Zwischenablage", compound=tk.LEFT,
image=img_kopiere_zu_zwischenablage,
command=lambda: copy_to_clipboard(entry_erzeugtes_passwort.get()))
button_kopiere_zu_zwischenablage.place(x=10, y=320, width=180)

canvasWaagerecht = Canvas(frame, bg="lightgray")
canvasWaagerecht.place(x=5, y=360, width=390, height=5)


button_passwort_erzeugen = tk.Button(frame, text=" Passwort erzeugen", command=passwort_erzeugen, compound=tk.LEFT,
image=img_passwort_generator)
button_passwort_erzeugen.place(x=10, y=380, width=180)
button_programm_schliessen = tk.Button(frame, text=" Programm schliessen", compound=tk.LEFT,
image=img_schliesse_programm, command=lambda: root.destroy())
button_programm_schliessen.place(x=210, y=380, width=180)

# Statusbar einrichten
statusbar = tk.Label(root, text="", bd=1, relief=tk.SUNKEN, anchor=tk.W, bg="lightyellow")
statusbar.place(x=0, y=420, width=400)

statusbar1 = tk.Label(root, text=datetime.today().strftime("%d.%m.%Y"), bd=1, relief=tk.SUNKEN, anchor=tk.W,
bg="lightyellow")
statusbar1.place(x=330, y=420, width=90)

root.mainloop()
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Du musst deinen Code zwischen Code Tags setzen, damit die Einrückung erhalten bleibt.
Die werden automatisch eingefügt, wenn du den </> Button im vollständigen Editor drückst.
ereetzer
User
Beiträge: 9
Registriert: Samstag 24. September 2022, 13:08

Hmm, ich bin zu alt oder so, ich finde nichts um den Eintrag zu editieren, daher ein neuer Post.

Code: Alles auswählen

import tkinter
import tkinter as tk
import random
import string
from tkinter import Tk, messagebox, Canvas
import itertools
from idlelib.tooltip import Hovertip
from datetime import datetime
# TODO mehrere Passwörter auf einmal (in Listbox, statt Entry dann
# TODO Minimum Anzahl Zeichen an uppercase, lowercase etc.

# Globals
programm_name = "Passwort Generator"


def check_for_passwort_staerke(passwort):
    if int(len(passwort) < int(6)):
        return "schwach"
    elif (int(len(passwort) > int(12)) and
          any(ch in string.ascii_lowercase for ch in passwort) and
          any(ch in string.ascii_uppercase for ch in passwort) and
          any(ch in string.punctuation for ch in passwort) and
          any(ch.isdigit() for ch in passwort)):
        return "stark"
    else:
        return "mittel"


def delete_same_characters_after_each_other(tmpstr):
    ergebnis = "".join(c[0] for c in itertools.groupby(tmpstr))
    return ergebnis


def delete_characters_from_string(passwort, welche_zeichen):
    # zeichen = "!§$%&/()=?´´\}][{"
    ergebnis = passwort.translate({ord(i): None for i in welche_zeichen})
    return ergebnis


def copy_to_clipboard(passwort):
    r = Tk()
    r.withdraw()
    r.clipboard_clear()
    r.clipboard_append(passwort)
    r.destroy()


def ueberpruefe_passwort(passwort):
    # überprüfen ob Zahlen enthalten sind
    if var_zahlen.get():
        if not any(p in passwort for p in string.digits):
            fehler_zahlen = {None}
        else:
            fehler_zahlen = ""
    else:
        fehler_zahlen = ""
    # überprüfe, ob kleine Buchstaben enthalten sind
    if var_kleine_buchstaben.get():
        if not any(p in passwort for p in string.ascii_lowercase):
            fehler_kleine_buchstaben = {None}
        else:
            fehler_kleine_buchstaben = ""
    else:
        fehler_kleine_buchstaben = ""
    # überprüfen ob grosse Buchstaben enthalten sind
    if var_grosse_buchstaben.get():
        if not any(p in passwort for p in string.ascii_uppercase):
            fehler_grosse_buchstaben = {None}
        else:
            fehler_grosse_buchstaben = ""
    else:
        fehler_grosse_buchstaben = ""
    # überprüfen ob Satzzeichen enthalten sind
    # Zeichen als Sonderzeichen/Satzzeichen definiert: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
    if var_satzzeichen.get():
        if not any(p in passwort for p in string.punctuation):
            fehler_satzzeichen = {None}
        else:
            fehler_satzzeichen = ""
    else:
        fehler_satzzeichen = ""
    # überprüfen um Umlaute enthalten sind
    if var_umlaute.get():
        if not any(p in passwort for p in "äÄüÜöÖß"):
            fehler_umlaute = {None}
        else:
            fehler_umlaute = ""
    else:
        fehler_umlaute = ""

    ist_passwort_ok = not (fehler_zahlen or fehler_kleine_buchstaben or fehler_grosse_buchstaben or
                           fehler_satzzeichen or fehler_umlaute)
    return ist_passwort_ok


def passwort_erzeugen():
    time_start = datetime.now()
    try:
        # noinspection PyUnusedLocal
        test = int(str(entry_anzahl_zeichen_minimal.get()))
        # noinspection PyUnusedLocal
        test = int(str(entry_anzahl_zeichen_maximal.get()))
    except:
        messagebox.showerror("Fehler", "es wurde keine Zahl bei minimale oder maximale Zeichen angegeben")
        return
    passwort_laenge_minimal = int(entry_anzahl_zeichen_minimal.get())
    passwort_laenge_maximal = int(entry_anzahl_zeichen_maximal.get())
    if passwort_laenge_maximal < passwort_laenge_minimal:
        messagebox.showerror("Fehler", "die maximale Länge muss die minimale Passwortlänge überschreiten")
        return
    if not var_zahlen.get() and not var_kleine_buchstaben.get() and not var_grosse_buchstaben.get() and not \
            var_satzzeichen.get() and not var_umlaute.get():
        messagebox.showerror("Fehler", "es muss mindestens 1 Option angeklickt sein")
        return
    if passwort_laenge_minimal < 1:
        messagebox.showerror("Fehler", "Die minimale Anzahl an Zeichen muss '1' betragen")
    passwort_laenge = random.randint(passwort_laenge_minimal, passwort_laenge_maximal)
    passwort = ""
    # 1 ausgewählt, 0 = nicht ausgewählt
    if var_kleine_buchstaben.get():
        # passwort = random.choice(string.ascii_lowercase)
        passwort += string.ascii_lowercase
    if var_grosse_buchstaben.get():
        # passwort += random.choice(string.ascii_uppercase)
        passwort += string.ascii_uppercase
    if var_satzzeichen.get():
        # passwort += random.choice(string.punctuation)
        passwort += string.punctuation + string.punctuation
    if var_zahlen.get():
        # passwort += random.choice(string.digits)
        passwort += string.digits + string.digits + string.digits
    if var_umlaute.get():
        passwort += "äÄüÜöÖß"
        # noinspection PyUnusedLocal
    # noinspection PyUnusedLocal
    erzeugtes_passwort = "".join(random.choice(passwort) for i in range(passwort_laenge))
    if ueberpruefe_passwort(erzeugtes_passwort):
        # eventuelle doppelte Zeichen die hintereinander kommen, löschen
        if var_doppelte_zeichen.get():
            erzeugtes_passwort = delete_same_characters_after_each_other(erzeugtes_passwort)
            entry_erzeugtes_passwort.delete(0, tk.END)
            entry_erzeugtes_passwort.insert(0, erzeugtes_passwort)
            label_passwort_laenge.configure(text="Passwortlänge: " + str(len(erzeugtes_passwort)))
        else:
            pass
        # Zeichen ausschliessen, wenn eingestellt
        if not entry_zeichen_ausschliessen.get() == "":
            zeichen = entry_zeichen_ausschliessen.get()
            erzeugtes_passwort = delete_characters_from_string(erzeugtes_passwort, zeichen)
            entry_erzeugtes_passwort.delete(0, tk.END)
            entry_erzeugtes_passwort.insert(0, erzeugtes_passwort)
            label_passwort_laenge.configure(text="Passwortlänge: " + str(len(erzeugtes_passwort)))
        else:
            pass
        if len(erzeugtes_passwort) < int(entry_anzahl_zeichen_minimal.get()):
            passwort_erzeugen()
            return
        else:
            entry_erzeugtes_passwort.delete(0, tk.END)
            entry_erzeugtes_passwort.insert(0, erzeugtes_passwort)
            label_passwort_laenge.configure(text="Passwortlänge: " + str(len(erzeugtes_passwort)))
        print(erzeugtes_passwort)
        passwort_staerke = check_for_passwort_staerke(erzeugtes_passwort)
        if passwort_staerke == "schwach":
            label_erzeugtes_passwort.configure(bg="red")
            entry_erzeugtes_passwort.configure(bg="red")
        if passwort_staerke == "mittel":
            label_erzeugtes_passwort.configure(bg="yellow")
            entry_erzeugtes_passwort.configure(bg="yellow")
        if passwort_staerke == "stark":
            label_erzeugtes_passwort.configure(bg="green")
            entry_erzeugtes_passwort.configure(bg="green")
        Hovertip(label_erzeugtes_passwort, passwort_staerke)
    else:
        # wenn nicht ok, funktion erneut aufrufen, solange bis ok
        passwort_erzeugen()
    time_end = datetime.now()
    time_delta = time_end - time_start
    execution_time = str(time_delta.total_seconds())
    statusbar.configure(text="Verstrichene Zeit in Sekunden: " + execution_time)


# ======================================================================================================================
# Hauptfenster einrichten===============================================================================================
# ======================================================================================================================
root = tk.Tk()
img_passwort_generator = tk.PhotoImage(file="password-key-16.png")
img_passwort_generator = tk.PhotoImage(file="")
img_schliesse_programm = tk.PhotoImage(file="close_program.png")
img_kopiere_zu_zwischenablage = tk.PhotoImage(file="clipboard_plus.png")
root.title(programm_name)
root.geometry("400x440")
# root.minsize(width=400, height=250)  # Mindestbreite und höhe einstellen
# root.maxsize(width=1620, height=800)  # Maximalbreite und höhe einstellen
root.resizable(width=False, height=False)  # Fensterbreite und höhe kann nicht verstellt werden
root.iconphoto(False, img_passwort_generator)
# Frame über gesamtes Hauptfenster einrichten
frame = tk.Frame(root)
frame.pack(fill=tk.BOTH, expand=True)

labelframe_einstellungen = tk.LabelFrame(frame, text="Einstellungen zum generieren", font="Arial 10 bold")
labelframe_einstellungen.place(x=10, y=10, width=380, height=250)

# Widgets um festzulegen aus welchen Zeichen das Passwort bestehen soll
var_zahlen = tk.IntVar()
checkbox_mit_zahlen = tk.Checkbutton(labelframe_einstellungen, text="Zahlen berücksichtigen", variable=var_zahlen)
checkbox_mit_zahlen.place(x=10, y=10)
checkbox_mit_zahlen.select()
var_kleine_buchstaben = tk.IntVar()
checkbox_mit_buchstaben_klein = tk.Checkbutton(labelframe_einstellungen, text="kleine Buchstaben berücksichtigen",
                                               variable=var_kleine_buchstaben)
checkbox_mit_buchstaben_klein.place(x=10, y=30)
checkbox_mit_buchstaben_klein.select()
var_grosse_buchstaben = tk.IntVar()
checkbox_mit_buchstaben_gross = tk.Checkbutton(labelframe_einstellungen, text="grosse Buchstaben berücksichtigen",
                                               variable=var_grosse_buchstaben)
checkbox_mit_buchstaben_gross.place(x=10, y=50)
checkbox_mit_buchstaben_gross.select()
var_satzzeichen = tk.IntVar()
checkbox_mit_satzzeichen = tk.Checkbutton(labelframe_einstellungen, text="Satzzeichen berücksichtigen",
                                          variable=var_satzzeichen)
checkbox_mit_satzzeichen.place(x=10, y=70)
checkbox_mit_satzzeichen.select()
var_umlaute = tk.IntVar()
checkbox_mit_sonderzeichen_normal = tk.Checkbutton(labelframe_einstellungen,
                                                   text="Umlaute berücksichtigen (äÄ, üÜ, öÖ)", variable=var_umlaute)
checkbox_mit_sonderzeichen_normal.place(x=10, y=90)

label_anzahl_zeichen_minimal = tk.Label(labelframe_einstellungen, text="Anzahl Zeichen minimal: ")
label_anzahl_zeichen_minimal.place(x=10, y=120, width=150)
entry_anzahl_zeichen_minimal = tk.Entry(labelframe_einstellungen)
entry_anzahl_zeichen_minimal.place(x=180, y=120)
label_anzahl_zeichen_maximal = tk.Label(labelframe_einstellungen, text="Anzahl Zeichen maximal: ")
label_anzahl_zeichen_maximal.place(x=10, y=140, width=150)
entry_anzahl_zeichen_maximal = tk.Entry(labelframe_einstellungen)
entry_anzahl_zeichen_maximal.place(x=180, y=140)

var_doppelte_zeichen = tk.IntVar()
checkbox_doppelte_zeichen = tk.Checkbutton(labelframe_einstellungen, text="es dürfen keine Zeichen doppel "
                                                                          "nacheinander vorkommen",
                                           variable=var_doppelte_zeichen)
checkbox_doppelte_zeichen.place(x=10, y=170)
checkbox_doppelte_zeichen.select()

label_zeichen_ausschliessen = tk.Label(labelframe_einstellungen, text="Zeichen ausschliessen: ")
label_zeichen_ausschliessen.place(x=10, y=200)
entry_zeichen_ausschliessen = tk.Entry(labelframe_einstellungen)
entry_zeichen_ausschliessen.place(x=180, y=200, width=105)
entry_zeichen_ausschliessen.insert(0, "{}´`*~^°")
button_zeichen_ausschliessen_delete = tk.Button(labelframe_einstellungen, compound=tk.LEFT,
                                                image=img_schliesse_programm,
                                                command=lambda: entry_zeichen_ausschliessen.delete(0, tk.END))
button_zeichen_ausschliessen_delete.place(x=285, y=200, width=20, height=20)

# Voreinstellung für minimale und maximale Zeichen
entry_anzahl_zeichen_minimal.insert(0, "8")
entry_anzahl_zeichen_maximal.insert(0, "10")


# Widgets im Hauptfenster erzeugen
label_erzeugtes_passwort = tk.Label(frame, text="Passwort:")
label_erzeugtes_passwort.place(x=10, y=260)

entry_erzeugtes_passwort = tk.Entry(frame, font="bold")
entry_erzeugtes_passwort.place(x=10, y=280, width=380)
label_passwort_laenge = tk.Label(frame, text="")
label_passwort_laenge.place(x=10, y=302)

button_kopiere_zu_zwischenablage = tk.Button(frame, text="  Zwischenablage", compound=tk.LEFT,
                                             image=img_kopiere_zu_zwischenablage,
                                             command=lambda: copy_to_clipboard(entry_erzeugtes_passwort.get()))
button_kopiere_zu_zwischenablage.place(x=10, y=320, width=180)

canvasWaagerecht = Canvas(frame, bg="lightgray")
canvasWaagerecht.place(x=5, y=360, width=390, height=5)


button_passwort_erzeugen = tk.Button(frame, text="  Passwort erzeugen", command=passwort_erzeugen, compound=tk.LEFT,
                                     image=img_passwort_generator)
button_passwort_erzeugen.place(x=10, y=380, width=180)
button_programm_schliessen = tk.Button(frame, text="  Programm schliessen", compound=tk.LEFT,
                                       image=img_schliesse_programm, command=lambda: root.destroy())
button_programm_schliessen.place(x=210, y=380, width=180)

# Statusbar einrichten
statusbar = tk.Label(root, text="", bd=1, relief=tk.SUNKEN, anchor=tk.W, bg="lightyellow")
statusbar.place(x=0, y=420, width=400)

statusbar1 = tk.Label(root, text=datetime.today().strftime("%d.%m.%Y"), bd=1, relief=tk.SUNKEN, anchor=tk.W,
                      bg="lightyellow")
statusbar1.place(x=330, y=420, width=90)

root.mainloop()

Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Der erste Import wird gar nicht benutzt.
In `check_for_passwort_staerke` wandelst Du literale Zahlen in int um, und das Umwandeln der Wahrheitswerte in int, um sie danach nur wieder als Wahrheitswert zu benutzen, ist ziemlich umständlich.
In `copy_to_clipboard` erzeugst Du ein weiteres Exemplar von Tk, es darf aber nur eines im gesamten Programm geben.
In `ueberpruefe_passwort` verwendest Du ein Set mit exakt einem Wert (None) als Ersatz für True und eine leere Zeichenkette statt False. Da muß man als Leser lange rätseln, was das denn zu bedeuten hat. Alles was eine Funktion braucht, muß sie über ihre Argumente bekommen, var_zahlen, var_kleine_buchstaben, var_grosse_buchstaben, var_satzzeichen und var_umlaute fehlen.
In `passwort_erzeugen` versuchst Du erst die Eingabe in Zahlen umzuwandeln, um auf Fehlern zu prüfen, und dann machst Du das selbe nochmal, um die Zahlen dann auch weiter zu verwenden. Das Prüfen sollte aber nicht extra gemacht werden. Exceptions müssen immer so konkret angegeben werden, wie möglich, hier also ValueError.
Statt rekursiv die Funktion immer wieder aufzurufen, sollte man eine Schleife benutzen. Dabei gibt es durchaus Fälle, bei denen unter den gegebenen Randbedingungen kein gültiges Passwort möglich ist. Im Idealfall erzeugt Dein Algoithmus nur gültige Passwörter!
Wenn Du die verstrichene Zeit in Sekunden ermittlen willst, benutze time.monotonic nicht datetime.now.
Als Argumente fehlen entry_anzahl_zeichen_minimal, entry_anzahl_zeichen_maximal, var_zahlen, var_kleine_buchstaben, var_grosse_buchstaben, var_satzzeichen, var_umlaute, label_erzeugtes_passwort, entry_erzeugtes_passwort und statusbar.

Alles ab ›Hauptfenster einrichten‹ gehört in eine Funktion, die üblicherweise `main` genannt wird, dann kann es auch nicht passieren, dass andere Funktionen Variablen benutzen, die sie nicht als Argumente übergeben bekommen.
Fenster haben keine feste Größe und Elemente plaziert man mit grid oder pack, nicht mit place. Jetzt ist die GUI unter Umständen unbenutzbar, weil sich Felder überlappen.
ereetzer
User
Beiträge: 9
Registriert: Samstag 24. September 2022, 13:08

Danke, das hört sich an als wäre ich ein ziemlicher Idiot :-), alles gut, Danke für Deine Nachricht. Hilft mit sicher weiter.
Gerne mehr nützlich Hinweise.
Eventuell auch zum Programm an sich.
Danke.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Du bist kein Idiot, sondern fängst gerade erst an, und da kannst Du noch nicht alles wissen.
Antworten