Das mag ”funktionieren” ist aber ziemlich schrecklicher Code und löst das Problem auch falsch. Wozu ist denn in diesem Code die `labels`-Liste da? Genau um die geht es doch eigentlich, es wird aber gar nichts sinnvolles damit gemacht.
Aber der Reihe nach: Sternchen-Importe sind Böse™. Man müllt sich damit den Namensraum des aktuellen Moduls unnötig voll.
Auf Modulebene gehört nur Code der Konstanten, Funktionen, und Klassen definiert. Keine Variablen. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Keine kryptischen Abkürzungen wie `lbl` oder `btn` oder `zw`. Keine nummierten Namen. Und keine Grundatentypen in Namen.
Bei nummerierten Namen will man die Nummer einfach weglassen wenn es sowieso nur eine 1 gibt. Ansonsten will man sich *sinnvolle* Namen ausdenken oder gar keine Einzelnamen sondern eine Datenstruktur. Oft eine Liste. Bei `btn1_click()` und `btn2_click()` sind die Namen besch…eiden und man möchte dort sinnvolle Namen verwenden die beschreiben was die Funktionen machen. Oder, weil es Rückruffunktionen sind, Namen die Beschreiben bei welchem Ereignis die Funktion ausgeführt werden soll.
Es ist ja eine Sache sich was Leerzeichensetzung angeht nicht an den
Style Guide for Python Code zu halten, aber offenbar einen Würfel zu benutzen um an jeder einzelnen Stelle zu entscheiden ob man ein Leerzeichen setzt oder nicht ist extrem.
Die Fenstergrösse gibt man nur vor wenn die GUI mindestens ein Element enthält das sich in der Grösse verändert wenn der Benutzer manuell die Fenstergrösse verändert. Ansonsten ergibt sich die Fenstergrösse automatisch durch den Inhalt des Fensters. Ausser man vewendet `place()` – was man aber nicht tut. Unter anderem weil sonst die Fenstergrösse nicht automatisch ermittelt werden kann.
Daraus das Variablen nicht auf Modulebene gehören, resultiert das Funktionen und Methoden alles was sie ausser Konstanten benötigen als Argument(e) übergeben bekommen. An der Stelle braucht man in GUIs mindestens ``lambda``-Ausdrücke oder `functools.partial()` oder objektorientierte Programmierung (OOP). OOP braucht man für jede nicht-triviale GUI.
`x` ist ein schlechter Name für eine Zeichenkette in einer Schleife und den dan nur zu verwenden um die Zeichenkette an einen anderen furchtbar schlechten Namen (`zw`) zu binden ist ziemlich sinnfrei.
Code: Alles auswählen
#!/usr/bin/env python3
from functools import partial
import tkinter as tk
def create_labels(image, frame, labels, texts):
print("Labels erstellen")
for text in texts:
label = tk.Label(frame, text=text, image=image, compound=tk.CENTER)
label.pack()
labels.append(label)
def destroy_labels(labels):
print("Labels löschen")
for label in labels:
label.destroy()
labels.clear()
def main():
fenster = tk.Tk()
image = tk.PhotoImage(file="StartBild.png")
label_texts = [
"wert 1",
"wert 2",
"wert 3",
"wert 100",
"wert 101",
"wert Hallo",
"usw",
]
frame = tk.Frame(fenster, bg="skyblue")
frame.pack(side=tk.LEFT)
label = tk.Label(frame, text="Hallo", image=image)
label.pack()
labels = [label]
button_frame = tk.Frame(fenster)
button_frame.pack(side=tk.LEFT, anchor=tk.S)
tk.Button(
button_frame,
text="Create",
command=partial(create_labels, image, frame, labels, label_texts),
).pack()
tk.Button(
button_frame, text="Clear", command=partial(destroy_labels, labels)
).pack()
fenster.mainloop()
if __name__ == "__main__":
main()