@MaximalMax: Sternchen-Importe sind Böse™. Da holt man sich gerade bei `tkinter` fast 200 Namen ins Modul von denen nur ein kleiner Bruchteil verwendet wird. Auch Namen die gar nicht in `tkinter` definiert werden, sondern ihrerseits von woanders importiert werden. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen.
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. In dem Zusammenhang ist es ungünstig `main` auch noch als Namen des Fensters zu verwenden. Keine globalen Variablen hat zur Folge das Funktionen und Methoden alles was sie ausser Konstanten benötigen als Argument(e) übergeben bekommen. Das bedeutet bei GUIs mindestens Closures, bei jeder nicht-trivialen GUI aber auch objektorientierte Programmierung (OOP), also eigene Klassen.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Namen sollten keine kryptischen Abkürzungen enthalten (`generatebtn`, …) oder gar nur daraus bestehen (`pwl`, `pws`) und nicht nummeriert werden. Zwischen Worte in Namen gehört ein Unterstrichdamitdaslesbarerist.
Man muss auch nicht jedes Zwischenergebnis an Namen binden.
`geometry()` sollte man nicht verwenden solange die GUI nicht Elemente enthält die dann automatisch den Platz füllen. Die Grösse wird ja bereits durch den Layoutmanager an den Inhalt angepasst.
In `generatepw()` wird ja auch wirklich fast jedes Zwischenergebnis an einen Namen gebunden. Die ganze Funktion lässt sich mit einem Generatorausdruck als *ein* Ausdruck schreiben.
Zwischenstand:
Code: Alles auswählen
#!/usr/bin/env python3
import random
import string
import tkinter as tk
from functools import partial
LETTERS = string.ascii_letters
def generate_password(display_entry):
display_entry.insert(0, "".join(random.choice(LETTERS) for _ in range(10)))
def main():
title = "GUI-Passwort-Generator"
root = tk.Tk()
root.title(title)
tk.Label(root, text=title, font=("sans-serif", 15)).pack()
tk.Label(root).pack()
generate_button = tk.Button(root, text="Erstellen")
generate_button.pack()
tk.Label(root).pack()
display_entry = tk.Entry(root)
display_entry.pack()
generate_button["command"] = partial(generate_password, display_entry)
root.mainloop()
if __name__ == "__main__":
main()