ich muss leider nochmal nerven und das Forum in Anspruch nehmen. Ich habe meinen tkinter Programm erweitert/umgeschrieben und weiß leider nicht genau warum es funktioniert, bzw. kann mir nicht erklären wo die betreffende 'self.button_count' Variable gespeichert wird.
Ablauf:
Wird das Programm gestartet erscheint nur ein Button mit dem Text "Add Button" klickt man auf diesen Button werden beliebig viele neue Buttons hinzugefügt. Deren Bezeichnung entspricht deren Anzahl, beginnend bei Null. Die Variabel 'self.button_count' wird bei jedem hinzufügen eines Button um eins erhöht, zusätzlich steuert diese Variable auch die Platzierung bzw. die row-Nummer. Jeder neu hinzugefügte Button wird in die Liste 'button_list' geschrieben (Dank sirius3)
Klickt man auf einem hinzugefügten Button wird eine lambda Funktion ausgelöst, diese Übergibt die 'self.button_count' Variable des angeklickten Buttons an die destroy_button Funktion. Zuerst wird eine Ausgabe mit den zerstörten Button ausgegeben und im Anschluss der Button zerstört.
Frage:
Warum funktioniert das so, bzw. wo wird pro Button die Variabel 'self.button_count' gespeichert. Wenn man z. B. fünf Buttons erzeugt, entspricht der Variablenwert am Schluss fünf also der maximalen Anzahl an hinzugefügten Buttons. Ich würde erwarten, dass jeder Button dann den Wert fünf ausgibt und nicht seine "eigene" Nummer, da der vorherige Wert immer überschrieben wird.
Ich habe versucht mich an alle Regeln bzgl. Variablennamen und Leerzeilen zu halten, ich hoffe es hat geklappt .
Code: Alles auswählen
import tkinter as tk
class Programm(tk.Tk):
def __init__(self):
super().__init__()
self.add_button = tk.Button(self, text="Add Button", command=self.button_add) # hinzufüge Button
self.add_button.grid(row=0, column=0) # "hinzufüge Button" in die Oberfläche platzieren
self.button_count = 0 # zählt jeden hinzugefügten Button und bestimmt deren Platzierung
self.button_list = [] # Liste mit den hinzugefügten Buttons um darauf zugreifen zu können
def button_add(self): # Funktion um beliebig viele Buttons hinzuzufügen
button = tk.Button(self, text="Number " + str(self.button_count), # neuer Button mit seiner row-Nummer als Text
command=lambda button_number = self.button_count : self.destroy_button(button_number))
# die lambda Funktion übergibt die Variable button_count and die destry_button funktion
button.grid(row=self.button_count+1, column=0)
self.button_count += 1
self.button_list.append(button)
def destroy_button(self,button_number): # zerstörungsfunktion anhand von self.button_count und Liste der hinzugefügten Buttons
print("Button " + str(button_number) + " is destroyed")
self.button_list[button_number].destroy()
def main():
root = Programm()
root.mainloop()
if __name__ == "__main__":
main()
Gruß Kai