@SvKaGli: Anmerkungen zum Quelltext:
Sternchen-Importe sind Böse™. Damit holt man sich gerade bei `tkinter` fast 200 Namen ins Modul von denen nur ein kleiner Bruchteil tatsächlich benötigt wird. Und nicht nur Namen die im `tkinter`-Modul selbst definiert werden, sondern auch alle Namen die das Modul seinerseits von woanders importiert.
Für die `sticky`-Argumente von der `grid()`-Methode gibt es auch Kontanten im `tkinter`-Modul.
`hauptfenster` schreibt man mit `p`. KeineLeerzeichenzwischenwortensindschwerlesbar. Das gilt auch für fehlende Unterstriche in Namen. Also beispielsweise`filme_und_serien_icon` statt `filmeundserienicon`.
Die Aufteilung des Codes macht es nicht einfach zu erkennen was wo platziert wird und macht es auch unnötig schwer die Funktion irgendwann einmal aufzuteilen. Einige der Namen braucht man auch gar nicht wenn man den Code nicht so verteilt. Von Labeln die nur zur Beschriftung dienen und nicht zur Ausgabe von sich ändernden Werten braucht man beispielsweise so gut wie nie einen Namen.
Code- und Datenwiederholungen sollte man vermeiden, weil das fehleranfällig und unflexibel ist. In dem Quelltext wiederholt sich beispielsweise der Pfad zu den Grafiken recht häufig. Wenn man den anpassen/ändern möchte, muss man das an vielen Stellen tun. So etwas definiert man in der Regel einmal am Anfang des Programms.
Code wird beim erstellen der Buttons wiederholt. Das ist bei jedem Button das gleiche Muster: Icon laden, `Button`-Objekt erstellen, und mit `pack()` anordnen. Der Unterschied ist jeweils im Grunde nur der Dateiname des Icons. Code-Wiederholungen kann man mit Schleifen und/oder Funktionen beseitigen. Zum Beispiel eine Funktion die alle drei Schritte für einen Button durchführt, und dann eine Schleife über die Icon-Dateinamen, die diese Funktion für jeden Namen aufruft.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
import tkinter as tk
from pathlib import Path
GRAFIK_PFAD = Path("Grafiken", "Buttons")
def add_icon_button(master, dateipfad, button_options, pack_options):
icon = tk.PhotoImage(file=dateipfad)
button = tk.Button(master, image=icon, **button_options)
button.image = icon
button.pack(**pack_options)
return button
def main():
hauptfenster = tk.Tk()
hauptfenster.title("Multiquiz")
hauptfenster.configure(bg="#606060")
options = {"bg": "#a3a0a0"}
leiste_oben = tk.Frame(hauptfenster)
for dateiname in [
"Einstellungen.png",
"Meinprofil.png",
"Hilfe.png",
"Meine_webseite.png",
]:
add_icon_button(
leiste_oben, GRAFIK_PFAD / dateiname, options, {"side": tk.LEFT}
)
leiste_oben.grid(row=0, column=0, sticky=tk.NW)
leiste_links = tk.Frame(hauptfenster)
tk.Label(leiste_links, text="Kategorien:", **options).pack()
for dateiname in ["Geschichte.png", "Filme und Serien.png", "Games"]:
add_icon_button(leiste_links, GRAFIK_PFAD / dateiname, options, {})
tk.Label(leiste_links, text="Das Minispiel:", **options).pack()
leiste_links.grid(row=1, column=0, sticky=tk.W)
hauptfenster.mainloop()
if __name__ == "__main__":
main()