tkinter Objekt keys ausgeben

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 Tag,
ich habe ein Problem mit tkinter, ich möchte mir die vorhandenen keys von Labeln, Buttons etc. ausgeben.
Dafür soll man folgenden Befehl ausführen

Code: Alles auswählen

Objekt.keys()
.
Es klappt bei mir aber nur wenn ich vorher die Objekte mit dem

Code: Alles auswählen

.pack()
Manager angeordnet habe, wenn ich

Code: Alles auswählen

.grid()
verwenden geht der Befehl nicht.
Hier ist der Beipielcode: Die Ausgabe funktioniert.

Code: Alles auswählen

import tkinter as tk

class Programm(tk.Tk):
    
    def __init__(self):
        super().__init__()
        
        self.dolarLabel = tk.Label(self ,text="Dollar: ")
        self.dolarLabel.pack()
        
        print(self.dolarLabel.keys())
        
        
def main():
    root = Programm()
    root.mainloop()
        
        
if __name__ == "__main__":
    main()
Die Ausgabe funktioniert nicht:

Code: Alles auswählen

import tkinter as tk

class Programm(tk.Tk):
    
    def __init__(self):
        super().__init__()
        
        self.dolarLabel = tk.Label(self ,text="Dollar: ").grid(row=0, column=0)
        
        print(self.dolarLabel.keys())
        
        
def main():
    root = Programm()
    root.mainloop()
        
        
if __name__ == "__main__":
    main()
Es kommt folgende Fehlermeldung:

Code: Alles auswählen

AttributeError: 'NoneType' object has no attribute 'keys'
Warum kann ich mir die Keys nicht auch bei Grid ausgeben, bzw. was muss ich verändern damit es auch damit geht ?

Gruß Kai

edit:
Die Ausgabe klappt mit diesem Code:

Code: Alles auswählen

import tkinter as tk

class Programm(tk.Tk):
    
    def __init__(self):
        super().__init__()
        
        self.dolarLabel = tk.Label(self ,text="Dollar: ")
        self.dolarLabel.grid(row=0, column=0)
        
        print(self.dolarLabel.keys())
        
        
def main():
    root = Programm()
    root.mainloop()
        
        
if __name__ == "__main__":
    main()
Warum klappt die Ausgabe, wenn ich das .grid() eine Zeile späte zuweise ?
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kahnbein.Kai: `grid()` und auch `pack()` haben keinen Rückgabewert, das heisst die geben `None` zurück. Und `None` hat halt keine (nicht-magischen) Methoden. Das ist ja auch nicht wirklich `tkinter`-spezifisch.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Ok, Danke.

Wieder was gelernt, wirklich nachvollziehbar ist es für mich als anfänger nicht. Warum

Code: Alles auswählen

self.dolarLabel = tk.Label(self ,text="Dollar: ").grid(row=0, column=0)
das nicht klappt aber

Code: Alles auswählen

self.dolarLabel = tk.Label(self ,text="Dollar: ")
self.dolarLabel.grid(row=0, column=0)
das schon.

Aber wieder was gelernt, muss man einfach wissen :)

Gruß Kai
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kahnbein.Kai: Was ist denn daran nicht nachvollziehbar? Jeder Aufruf hat einen Wert als Ergebnis. Und jeder Wert hat einen Datentyp. Und dieser Datentyp bestimmt was für Methoden und was für ein Verhalten der Wert hat. `grid()` hat `None` als Ergebnis und nicht den Wert auf dem die Methode aufgerufen wurde.

Wobei die beiden gezeigten Varianten an sich ja funktionieren. Nur dass es im ersten Fall halt ein bisschen sinnlos ist den `None`-Wert an ein Attribut zu binden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

@__Blackjack__: Ich habe es Verstanden, Danke nochmal für die Ausführlichere Erklärung.
Ich habe nochmal ein wenig rumprobiert. Hier an dem Code konnte ich das nachvollziehen. Ich wusste nicht das bei

Code: Alles auswählen

self.Label1 = tk.Label(self, text="test").grid()
der Typ None an die Variable geschrieben wird, ist aber eigentlich klar wenn man darüber nachdenkt. Direkt

Code: Alles auswählen

.grid()
an die Variable anzuschließen spart Zeilen und hält den Code übersichtlich, das dachte ich zumindest :)

Code: Alles auswählen

import tkinter as tk
class Programm(tk.Tk):
    
    def __init__(self):
        super().__init__()
    
        self.Label1Test = tk.Label(self ,text="Label1")
        self.Label1Test.grid(row=0, column=0)
        
        self.Label2Test = tk.Label(self, text="Label2").grid(row=0, column=1)
        
        print(type(self.Label1Test))
        print(type(self.Label2Test))
        
        self.button1 = tk.Button(self,text="Label1 Farbwechsel", command=self.FarbwechselButton1)
        self.button1.grid(row=1, column=0)
        
        self.button2 = tk.Button(self,text="Label2 Farbwechsel", command=self.FarbwechselButton2).grid(row=1,column=1)
        
    def FarbwechselButton1(self):
        self.Label1Test.config(bg="black")
            
    def FarbwechselButton2(self):
        self.Label2Test.config(bg="black")
        
    
        
def main():
    root = Programm()
    root.mainloop()
        
        
if __name__ == "__main__":
    main()
Schönen Abend noch und Gruß
Kai
Antworten