Master eines widgets wechseln

Fragen zu Tkinter.
Antworten
Prophet
User
Beiträge: 6
Registriert: Dienstag 6. Oktober 2009, 14:08

Hi mal wieder ^^

Ich sitze immer noch an dem selben Programm wie vor einigen Tagen, habe jetzt aber mal wieder ein völlig neues Problem.
In meinem Programm werden quasi ständig widgets hinzugefügt und entfernt (kein problem soweit) und aber auch manchmal mitten innerhalb der Hierarchie ersetzt.
Für letzteres muss ich ein neues Widget erstellen, die Kinder des alten Widget an das neue anhängen und das alte anschließend löschen.

Das Problem liegt bei mir jetzt an dem mittleren Schritt. Ich würde wie gesagt gerne den master/parent eines widgets ändern ohne es zu zerstören und neu zu erstellen, was in meinem Programm eben zu einigem ungewollten Overhead führen könnte, weil es wirklich sehr oft passieren kann.
Ich habe jetzt aber den leisen Verdacht, dass das garnicht sauber zu bewältigen ist, weil Tk ja diese feste widget-benennung hat und man den namen auch nicht nachträglich ändern kann und es ja auch keine "append" oder "remove" funktionen gibt um widgets zwischen verschiedenen parents hin und her zu jonglieren.

Hier ein (nicht funktionierndes) Beispiel dessen was ich hinbekommen will :

Code: Alles auswählen

from Tkinter import *

t = Tk()
f = Frame(t)
b = Button(f,text='Test')
b.pack()
f.pack()
#Frame f soll jetzt ersetzt werden durch neuen frame f2

f2 = Frame(t)
b.pack_forget()a
b.master = f2
f.children = {}
f.destroy()
b.pack()
f2.pack()
t.mainloop()
Was ich bräuchte wäre vermutlich etwas, was das gleiche ausdrückt wie "b.master = f2", nur eben nicht auf Ebene einer python-variable, sondern in Form irgendeiner Funktion, die die Veränderung auch auf Tcl-Ebene überträgt.

Wie gesagt : Eine mögliche Lösung des Problems ist es einfach das widget zu zerstören und an der Stelle ein neues widget einzufügen, dessen Kindelemente dann auch alle noch einmal neu erstellt würden. Ich möchte nur wissen ob es anders geht, so dass ich mir diesen Rechenaufwand sparen könnte. (Das neu-erstellen von Widgets ist deshalb bei mir relativ "teuer" weil jedesmal Dateien von der Festplatte gelesen werden müssen, die Informationen über das Widget enthalten.)

freundlche Grüße und danke schonmal fürs Anschauen
Prophet
BlackJack

Ich wüsste keine Lösung, aber warum müssen Dateien von Platte gelesen werden? Kann man die nicht im Modell halten und einfach von dort wieder abfragen?
Prophet
User
Beiträge: 6
Registriert: Dienstag 6. Oktober 2009, 14:08

Nein, eben leider nicht. Das ist der Sinn hinter dem ganzen Programm. Es baut die GUI quasi komplett von Daten auf der Festplatte auf und reagiert über pyinotify auf Veränderungen dieser Daten. Es ist auch wichtig, dass die Daten und die GUI in anderer richtung konsistent bleiben, daher muss sowieso jede Veränderung ins Dateisystem übertragen werden.
Entweder müsste also das ganze Dateisystem modelliert und Konsistenz zwischen GUI, Modell und Dateisystem eingehalten werden, was mir persönlich zu viel Aufwand und Overhead wäre, oder aber bei jedem neu erstellten Widget muss wieder von der Festplatte gelesen werden. : /

Aber trotzdem vielen Dank. So weiss ich jetzt wenigstens, dass ich wohl keine Methode einfach übersehen habe oder sonstwie nur knapp an einer einfachen Lösung vorbeigeschrappt bin. Dann werde ich es einfach über das Neu-Erstellen regeln.
Antworten