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

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()