Wie bekomme ich den tkinter Widget Typ heraus?

Fragen zu Tkinter.
Antworten
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Wie bekomme ich den tkinter Widget Typ heraus?

Es geht um meinen GUI Designer. Ob jemand eine abgeleitete Klasse benützt und dazu den GUI Designer zum Verändern des Widgets benutzt ist dem egal.
Nur ein Problem ist dann das Speichern. Wenn ich eine Listbox als WrdlBrmpfd speichern würde, das würde ja gehen. Man kann es nachher bloß nicht mehr laden.

Aber beim Speichern will ich nicht alle Config Einstellungen speichern, sondern nur die, welche sich gegenüber den Defaulteinstellungen verändert haben.
Und dazu vergleiche ich das Widget mit einem jungfräulichen tkinter Widget.

Wenn ich aber WrdlBrmpfd mit tk.WrdlBrmpfd vergleichen will, dann stürzt mir das Programm ab.
Kann ich mit einem Befehl herausbekommen, um welches Widget es sich handelt? Muss ich alle Widget Typen vergleichen oder sollte ich mir das am Besten gleich beim Anlegen merken?
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: am sinnvollsten ist es, sich eine Datenstruktur zu entwickeln, die alle nötigen Informationen speichert. Das wird dann zwangsläufig so etwas wie ein Baum. Dort legst Du dann nur die Einstellungen an, die auch geändert wurden, so sparst Du Dir das Vergleichen mit irgendwelchen Defaults. Vorteil der Datenstruktur: Du kannst sie einfach in eine Datei (am einfachsten JSON oder XML) serialisieren und deserialisieren. Du kannst einfach eine Methode schreiben, die einen komplett neuen Frame erzeugt (die Methode kannst Du ohne Änderungen auch in Produktivcode verwenden).
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Sirius Mach es doch nicht gleich kompliziert. Für das Speichern muss ich eh noch verschiedene Optionen anbieten.

Aber das Problem kann ich lösen, indem ich mal den Code update. Der sieht noch so aus:

Code: Alles auswählen

class Label(tk.Label,GuiElement):

	def __init__(self,myname="Label",**kwargs):
		kwargs["master"] = _Selection._container
		tk.Label.__init__(self,**kwargs)
		self.isContainer = False
		GuiElement.__init__(self,myname)
Und im nunmehr gesperrten Thread "Spazieren in der GUI" gibt es eine neue Fassung und da sieht der Code so aus:

Code: Alles auswählen

class Label(GuiElement,StatTkInter.Label):
        def __init__(self,myname="Label",**kwargs):
                _initGuiElement(kwargs,StatTkInter.Label,self,myname,"Label")
Das war schon länger her, aber da habe ich mit self.tkClass die erforderliche Info. Sollte meinen GUI Designer Code eben auch einmal updaten.
BlackJack

@Alfons Mittelmeyer: Liefert die `winfo_class()`-Methode nicht schon das was Du brauchst?
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@BlackJack Danke, die Info war prima
Antworten