tkInter auf Widgeds zugreifen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Guten Morgen,
ich möchte ein kleinen Programm schreiben, indem man neuen Widgeds per Tastendruck hinzufügen kann.
In diesem Testprogramm geht es erst einmal nur um Buttons. Hier ist der Code:

Code: Alles auswählen

import tkinter as tk

class Programm(tk.Tk):
    
    def __init__(self):
        super().__init__()
        
       
        
        self.neuerButton = tk.Button(self, text="Neuer Button",command=self.nButton)
        self.neuerButton.grid(row=1,column=0)
        
        self.changeBG = tk.Button(self, text="bg Änderung",command=self.bgChange)
        self.changeBG.grid(row=2,column=0)
        
        self.nrow = 3
        self.buttonList= []

    def nButton(self):
        self.Var = "Button" + str(self.nrow)
        
        print(self.Var) # erste Ausgabe
        
        self.buttonList.append(self.Var)
        
        self.Var = tk.Button(self, text=self.Var)
        self.Var.grid(row=self.nrow,column=0)
        
        self.nrow += 1
        
        print(self.Var) # zweite Ausgabe
        
        print(self.buttonList)
    
    def bgChange(self):
        self.Button4.configure(bg='blue')


            
def main():
    root = Programm()
    root.mainloop()
    
        
        
if __name__ == "__main__":
    main()
Das hinzufügen der neuen Buttons klappt, jedoch das Ändern des Backgrounds von Button4 nicht.
Wenn ein neuer Button hinzugefügt wird, wird der Name in der Liste "buttonList" gespeichert. Jeder Button Name setzt sich aus Button[Zahl] zusammen und wird im der Variable "Var" gespeichert.
Dabei ist mir eine Änderung in der Variable "Var" aufgefallen, in der ersten Ausgabe ist sie 'Button3', in der zweiten '.!button3'
Die Änderung des bg klappt jedoch nicht mit 'Button4', 'button4' oder '!button4'.

Wie kann ich auf den Button zugreifen ?

Gruß Kai
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

Zwischen Funktionen setzt man 2 Leerzeilen, innerhalb einer Funktion niemals mehr als eine. Du hast da aber 3. Das macht das Lesen des Codes sehr schwierig.
Variablennamen schreibt man komplett klein, das solltest Du inzwischen bei fast 100 Beiträgen hier im Forum schon sehr oft gehört haben, aber anscheinend noch nicht verinnerlicht.
Funktionen sollten nach Tätigkeiten benannt werden und keine kryptischen Abkürzungen enthalten, nButton ist wohl create_new_button, und bgChange change_background.
Alle Attribute sollten in __init__ angelegt werden, create_new_button aber erzeugt neue (Var), was aber gar kein Attribut sein sollte.
Var ist erst ein String und wird dann an ein Button-Objekt gebunden, man sollte aber eine Variable immer nur für einen Typ verwenden, alles andere führt zu Verwirrung, die Du anscheinend hier auch hast. Du steckst den String in deine Liste buttonList, damit kannst Du aber später gar nichts anfangen. Ich denke, Du willst das Button-Objekt in die Liste stecken.
Da nrow immer den Wert Länge der Liste + 3 hat, braucht es nrow gar nicht.
In change_background benutzt Du Button4, was Du aber nirgends definiert hast.
Ich vermute, Du möchtest Da ein Button-Objekt benutzen, das Du ja eigentlich in buttonList packen solltest.

Code: Alles auswählen

import tkinter as tk

class Programm(tk.Tk):
    def __init__(self):
        super().__init__()
        tk.Button(self,
            text="Neuer Button",
            command=self.create_new_button
        ).grid(row=1, column=0)
        tk.Button(self,
            text="bg Änderung",
            command=self.change_background
        ).grid(row=2,column=0)
        self.buttons = []

    def create_new_button(self):
        row_index = len(self.buttons) + 3
        button = tk.Button(self, text=f"Button{row_index}")
        button.grid(row=row_index, column=0)
        self.buttons.append(button)
    
    def change_background(self):
        self.buttons[-1].configure(bg='blue')


def main():
    root = Programm()
    root.mainloop()


if __name__ == "__main__":
    main()
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Hallo Sirius3,
vielen Dank für die ausführliche Erklärung. Du hast recht langsam sollte ich es wissen, manchmal gehen bei der Benamselung einfach die Pferde mit mir durch, Entschuldigung dafür. Ich versuche verstärkt drauf zu achten.
Das mit dem Namen für den Button war dafür gedacht, um später wieder auf jeden Button[3] ... Button[n+1] zugreifen zu können. Ich versuche das mal mit deinem Code umzusetzen.

Ich weiß nicht ob das der richtige Name ist aber gibt es in Python ein "dynamische" Variablenbezeichnung. z. B. bei diesem Beispiel:

Code: Alles auswählen

for i in range(3):
    x[i] = i + 100
print(x0)
print(x1)
print(x2)
    
Ist es möglich x0, x1 und x2 jeweils mit 100, 101 und 102 zuzuweisen ?

Gruß und ein schönes Wochenende Kai
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, das ist nicht sinnvoll, weil man einfach auch direkt über die Liste zugreifen kann.
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Alles klar, vielen Dank nochmal.

Gruß Kai
Antworten