Du benutzt einige Variablen, die gar nicht definiert sind, label_erzeugtes_passwort, entry_erzeugtes_passwort, notebook_art_passwort, entry_trennzeichen, spinbox_mindestlaenge_worter, spinbox_anzahl_worter, entry_wortliste und var_zahl_am_ende. Das sollten alles Argumente der Funktion sein, doch 8 Argumente sind recht unübersichtlich, so dass man sie am besten in ein komplexeres Objekt zusammenfasst; GUI-Programme brauchen zwangsläufig eigene Klassendefinitionen.
`time_start` wird gar nicht verwendet, der Name ist auch etwas verwirrend, weil ja nicht nur Zeit sondern ein Datum mit enthalten ist.
Es ist etwas seltsam, dass die Funktion davon abhängt, welches Notebook gerade aktiv ist.
Das eigentliche Problem, ein Passwort zu erzeugen, sollte von der GUI getrennt sein, so dass Du eine Funktion hast, die so aussehen könnte:
Code: Alles auswählen
def passwort_erzeugen(wortliste, trennzeichen, mindestlaenge, anzahl_worter, zahl_am_ende):
word_list = []
fileencoding = "utf-8"
# lese die datei in eine liste zeile für zeile
# noinspection PyUnusedLocal
with open(wortliste) as f:
words = [line.strip() for line in codecs.open(wortliste, "r", fileencoding)]
tmpcount = 1
while tmpcount <= anzahl_worter:
s = random.choice(words)
if len(s) >= mindestlaenge:
print(s)
word_list.append(s)
tmpcount = tmpcount + 1
else:
#messagebox.showerror("Fehler", "Mindestlänge nicht erreicht, es wird abgebrochen")
return
s = trennzeichen.join(word_list)
# zufällige Zahl zwischen 0 und 9 am Ende des Passwortes anfügen
if zahl_am_ende:
zuf_zahl = str(random.randint(0, 9))
s = s + zuf_zahl
return s
`wortliste` ist eigentlich ein Dateiname, also `wortliste_dateiname`. Du öffnest die Datei dann zweimal, einmal in einem with-Statemant, was Du aber gar nicht benutzt und nochmal, mit codecs.open, wobei Du diese Datei nicht mehr schließt. codecs.open ist eigentlich nicht mehr nötig, weil open auch schon die nötigen Parameter kennt.
`fileencoding` als Variable ist komisch, entweder ist das wirklich variabel, dann muß die Information von außen kommen, oder es ist konstant, dann kann man die Konstante gleich direkt bei open angeben.
Code: Alles auswählen
# lese die datei in eine liste zeile für zeile
with open(wortliste_dateiname, encoding="utf-8") as lines:
words = [line.strip() for line in lines]
Die Liste `word_list` wird etliche Zeilen vor dem Punkt initialisiert, wo sie gebraucht wird. Variablen sollten immer erst dann eingeführt werden, wenn man sie auch braucht.
`tmpcount` ist überflüssig. Hier wird keine Temperatur gezählt, sondern eigentlich Wörter. Und diese Anzahl ist einfach nur die Länge der Liste. Das `return` im else-Block ist wohl nicht das gewollte, weil Du ja zu kurze Wörter nur ignorieren willst, aber nicht gleich ganz abbrechen.
Code: Alles auswählen
word_list = []
while len(word_list) <= anzahl_worter:
word = random.choice(words)
if len(word) >= mindestlaenge:
word_list.append(word)
Was ist eine `zuf_zahl`? War das fehlende `all` zu teuer?
Inzwischen sieht der Code so aus:
Code: Alles auswählen
def passwort_erzeugen(wortliste_dateiname, trennzeichen, mindestlaenge, anzahl_worter, zahl_am_ende):
# lese die datei in eine liste zeile für zeile
with open(wortliste_dateiname, encoding="utf-8") as lines:
words = [line.strip() for line in lines]
word_list = []
while len(word_list) <= anzahl_worter:
word = random.choice(words)
if len(word) >= mindestlaenge:
word_list.append(word)
passwort = trennzeichen.join(word_list)
# zufällige Zahl zwischen 0 und 9 am Ende des Passwortes anfügen
if zahl_am_ende:
password += str(random.randint(0, 9))
return password
Nun könnte man erst die Wortliste nach den Wörtern der richtigen Länge filtern, das macht das zufällige Auswählen einfacher:
Code: Alles auswählen
def passwort_erzeugen(wortliste_dateiname,
trennzeichen, mindestlaenge, anzahl_worter, zahl_am_ende):
# lese die datei in eine liste zeile für zeile
with open(wortliste_dateiname, encoding="utf-8") as lines:
stripped_lines = (line.strip() for line in lines)
word_list = [word for word in stripped_lines
if len(word) >= mindestlaenge]
words = random.choices(word_list, k=anzahl_worter)
passwort = trennzeichen.join(words)
# zufällige Zahl zwischen 0 und 9 am Ende des Passwortes anfügen
if zahl_am_ende:
password += str(random.randint(0, 9))
return password