wx.TreeCtrl 'abspeichern'

Plattformunabhängige GUIs mit wxWidgets.
Antworten
LegaCer
User
Beiträge: 2
Registriert: Donnerstag 5. Februar 2009, 13:24

Moin Liebe Python-Forum User,

nach einiger Zeit des Mitlesens und passiven Teilhabens habe ich auch einmal eine Frage an euch.

Ich programmiere seit einiger Zeit an meinem ersten "größeren" Programm herum, welches eine Art spezieller Vokabeltrainer ist.
Da ich mich sehr gerne in Sachen einlese und selbst ausprobiere habe ich das komplette Programm mit wxpython geschrieben und mich anhand der Dokumentation durch das Designen der Gui gehangelbet.

Nun stehe ich allerdings vor folgendem Problem :
Ich habe ein wx.TreeCtrl-Widget, welches den User eine Verzeichnis-Struktur anhand von Mediendateien erstellen lässt. Dabei wird pro Datei jeweils ein Listeneintrag erstellt. Jeder Listeneintrag hat zudem ein Tupel als PyData mithängend.

Nun will ich, nachdem der User seinen Verzeichnis-Baum gebaut hat, den Baum abspeichern. Und hier komm ich irgendwie nicht weiter.
Hier ist meine bisherige Idee :
Sicherlich gibt es in Sachen Geschwindigkeit und Ästhetik noch diverse Code-Optimierungen. Mein erstes Ziel sollte die lauffähigkeit sein.
self.ListDBConf ist das Tree-Widget

Code: Alles auswählen

 #Saving the Tree-Entry's
        try:
            f = open('treentry.data','w')
        except IOError:
            #Not able to Save the Tree
            print "Error !"
            return
        if f.tell() != 0:f.seek(0)
        if self.ListDBConf.GetCount() > 0:
            fi = self.ListDBConf.GetFirstVisibleItem()
            if fi == self.ListDBConf.GetRootItem():
                fi = self.ListDBConf.GetNextVisible(fi)
            d = self.ListDBConf.GetItemPyData(fi)
            t = self.ListDBConf.GetItemText(fi)
            if d == None:
                f.write("0,0,"+str(t))
            else:
                f.write(str(d[0])+','+str(d[1])+','+str(t)+'\n')
            f.flush()
            for ts in range(0,self.ListDBConf.GetCount()-1):
                if self.ListDBConf.ItemHasChildren(fi):
                    self.ListDBConf.ExpandAllChildren(fi)
                    fi = self.ListDBConf.GetNextSibling(fi)
                else:
                    fi = self.ListDBConf.GetNextVisible(fi)
                d = self.ListDBConf.GetItemPyData(fi)
                t = self.ListDBConf.GetItemText(fi)
                if d == None:
                    f.write("0,0,"+str(t))
                else:
                    f.write(str(d[0])+','+str(d[1])+','+str(t)+'\n')
                f.flush()
Der Code sollte eigentlich jedes Tree-Item in einer Datei abspeichern. Dazu fängt es beim allerersten Item an und speichert seinen Namen und sein PyData-Tupel (sollte, da keins sein, wird 0 gespeichert). Danach wird geprüft, ob das aktuelle TreeItem Children hat und speichert diese ebenfalls.

Problem ist, dass die Methode wx.TreeCtrl.GetNextSibling() oder wx.TreeCtrl.GetNextVisible() anscheinend nicht so funktioniert, wie ich mir dies erhofft habe. Er speichert nur nen Haufen Nullen und nichtmal die Namen der Untereinträge.

Ich hab bereits gedacht, ob man das ganze auch via Rekursion viel einfacher machen kann, aber wenn es schon daran scheitert, dass ich nicht jedes Tree-item nacheinander abfragen kann, dann geht das wohl auch nicht...

Falls also einer von euch eine Idee hat, wie ich TreeItems gut abspeichern kann, damit sie einfach wieder in einem leeren Tree zu erstellen sind, dann nur raus damit^^
Ich freue mich über jeden Vorschlag :-)


Sollte es noch Fragen zu meiner Frage geben, etwa wenn ich mich ungünstig formuliert habe, dann nur raus damit.

Ich bedanke mich im Vorraus für jede Hilfe und wünsche noch einen schönen Tag.

LegaCer
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

schau dir mal wx.xrc an, damit kann man das mit XML eigentlich ganz schön umsetzen...
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ich glaube, der Ansatz, den Tree abzuspeichern, ist nicht ideal. Du hast doch Deine Daten sicher in irgendeiner Datenstruktur gespeichert, um mit ihnen im Programm vernünftig arbeiten zu können. Sinnvoller wäre es dann doch, diese Datenstruktur zu pickeln.
Falls Du unbedingt den Tree speichern willst, würde ich GetFirstChild und GetNextChild verwenden, um mich durch den Tree zu hangeln. Z.B. für einen Baum mit zwei Ebenen:

Code: Alles auswählen

        id1, cookie1 = self.tree.GetFirstChild(root)
        while True:
            try:
                data1 = self.tree.GetPyData(id1)
            except: # am besten mit expliziter Ausnahme
                break
            # Mach hier etwas mit data1
            id2, cookie2 = self.tree.GetFirstChild(id1)
            while True:
                try:
                    data2 = self.tree.GetPyData(id2)
                except: # siehe oben
                    break
                # Mach hier etwas mit data2
                id2, cookie2 = self.tree.GetNextChild(id1, cookie2)
            id1, cookie1 = self.tree.GetNextChild(self.root, cookie1)
MfG
HWK
LegaCer
User
Beiträge: 2
Registriert: Donnerstag 5. Februar 2009, 13:24

Vielen Dank für deine Hilfe HWK und sorry für die späte Rückmeldung !
Ich hab probiert mich ein wenig in dieses Cookie-System einzuarbeiten, aber das wurde mir irgendwann einfach zu viel :-D
Dann hab ich noch nen anderen Ansatz probiert und es mittels GetNextVisible gemacht.

http://paste.pocoo.org/show/103431/

Das ganze ist relativ idotisch Top-Down programmiert, aber dafür funktioniert es !
Jedenfalls für die ersten 26 Einlesungen...
Danach möchte es irgendwie nichtmehr weiterarbeiten und es werden nur noch Lesezeichen eingelesen :-D
Falls jemand weiß, woran das liegen könnte -> Nur raus damit !

PS:
Achja, ich hab den Code evt. nicht so gut dokumentiert, also falls es Fragen gibt immer raus damit !

PSS:
Ok, ich hab die Lösung^^
*Arghhh*
Der speichert die nit mehr, weil die weiteren Items nicht mehr im Window sichtbar sind, bzw. weil man da erst hin scrollen muss.
Ich glaub, ich bau mir nu so ne richtig schöne Funktion mit ScrollTo in ner Schleife :-D
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

LegaCer hat geschrieben:weil die weiteren Items nicht mehr im Window sichtbar sind, bzw. weil man da erst hin scrollen muss.
Ich glaub, ich bau mir nu so ne richtig schöne Funktion mit ScrollTo in ner Schleife :-D
Deshalb wäre die Lösung mit den Kindern sicher einfacher. Mein Beispiel sollte doch eigentlich ein guter Start sein, den Du nur noch nach Deinen Vorstellungen ergänzen musst. Mit den Cookies ist doch gar nichts anderes mehr zu tun.
MfG
HWK
Antworten