Implementierung der Baumstruktur in TreeCtrl

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Braindie
User
Beiträge: 20
Registriert: Mittwoch 10. Juni 2009, 07:54

Hi,

ich beschäftige mich seit einiger Zeit mit wx.python und möchte den Inhalt meiner Messdaten mittels einem Tree darstellen. Jedoch gehen mir so langsam die Ideen aus, wie ich meinen Tree erstelle.

Stand der Dinge:
Die Ausgabe des Pfades aus meiner Datenbank sieht wie folgt aus:
Ein Liste mit:
/Montag
/Montag/aa
/Montag/aa/1
/Montag/aa/1/test
/Montag/aa/2
/Montag/bb
/Montag/bb/1
/Dienstag
/Dienstag/aa
/Dienstag/aa/1
/Diesntag/aa/1/test
/Dienstag/aa/2
/Dienstag/bb
/Dientag/bb/1

Das ist jetzt ein einfachens Beispiel. Es kommen aber alle Kombinationen vor die man sich so denken kann.

Erst habe ich versucht eine Liste zu generieren die so aussieht wie
im Tutorial von Manning. Dazu hab ich die Liste beim "/" gesplittet, so dass ich die Namen direkt ansprechen konnte. Das hat leider bei mir wegen der Komplexität nicht geklappt. Dann habe ich versucht direkt die Äste und Zweige zu implementieren.
Da stoße ich jedoch auf das Problem, dass ich nicht weis wie ich feststellen kann ob der Knoten schon enthalten ist. Da es sich um Messwerte handelt, werden auf jeden fall doppelte Einträge vorkommen

Vielleicht hat jemand einen guten Vorschlag oder einen Lösungsansatz

Vielen Dank

Stefan
Zuletzt geändert von Braindie am Freitag 12. Juni 2009, 16:38, insgesamt 1-mal geändert.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

ehrlich gesagt verstehe ich noch nicht einmal das Problem. Und da auch sonst niemand antwortet, könnte das ein allgemeines Phänomen sein.

Was ist denn eigentlich die Frage?

Gruß,
Christian
Braindie
User
Beiträge: 20
Registriert: Mittwoch 10. Juni 2009, 07:54

Das habe ich mir auch schon gedacht.
Ich hab jetzt auch noch ein wenig weiter gebastelt.
Hier mal der Code wie ich den Tree erstelle.

Code: Alles auswählen

Name=[['','Montag'],['','Montag','a'],['','Montag','a','ab'],['','Montag','a','ab','abc'],
['','Dienstag'],['','Dienstag','a'],['','Dienstag','a','ab'],['','Dienstag','a','ab','abc']]

"""Baue Knoten der Baumstruktur auf"""
    def AddTreeNodes(self,parentItem):
        for i in numpy.arange(0,len(Name)-1):
            if len(Name[i])==2:
                List.append(self.tree.AppendItem(parentItem,Name[i][-1]))
            else:
                pattern= re.compile(Name[i][-2])
                for j,element in enumerate(List):
                    if pattern.match(self.tree.GetItemText(element)):
                        List.append(self.tree.AppendItem(List[j],Name[i][-1]))
Mein Problem ist, dass er in der letzten Schleife immer nur einen Item finden darf.
Jedoch zum Beispiel bei ['','Dienstag','a','ab'] das 'a' zweimal in meiner Suchliste findet und beide Knoten hinzufügt. Ich würde aber gerne den richtigen Knoten finden.

Vielleicht ist das jetzt ein bissle genauer.

Danke im Voraus
Stefan
Braindie
User
Beiträge: 20
Registriert: Mittwoch 10. Juni 2009, 07:54

Jetzt habe ich geschafft meinen Baum zu implementieren, wie ich ihn haben möchte.
Hat jemand vielleicht ein paar Optminierungsvorschläge?

Code: Alles auswählen

Name=[['','Montag'],['','Montag','a'],['','Montag','a','ab'],['','Montag','a','ab','abc'],
['','Dienstag'],['','Dienstag','a'],['','Dienstag','a','ab'],['','Dienstag','a','ab','abc']
Test=[]
"""Baue Knoten der Baumstruktur auf"""
    def AddTreeNodes(self,parentItem):
        for i in numpy.arange(0,len(Name)):
            if len(Name[i])==2:
                List.append(self.tree.AppendItem(parentItem,Name[i][-1]))
                Test.append(Name[i])
            else:
                pattern= re.compile(Name[i][-2])
                
                for j,element in enumerate(List):
                   
                    if pattern.match(self.tree.GetItemText(element)):
            
                        if Name[i][0:-1]==Test[j]:
                            List.append(self.tree.AppendItem(List[j],Name[i][-1]))
                            Test.append(Name[i])
                        else:
                            pass
               
Gruss

Stefan
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Vorschläge doch immer:

- PEP8 anschauen
- in der ersten for-Schleife direkt über die Liste iterieren und die Indizes sparen
- das leere else mit dem pass kannst du sparen

Sebastian
Das Leben ist wie ein Tennisball.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Stimme Sebastian zu. Und noch meine Vorschläge:

- Sebastian hat schon recht mit dem direkt iterieren, aber falls das mal nicht geht, kannst Du zwar über ein ndarray iterieren, wenn es sowieso besteht, aber es zum iterieren anzulegen ist keine gute Idee: Das kann sehr teuer werden. Besser ist es wohl xrange anstelle von numpy.arange in Zeile 7 zu verwenden. Noch besser: Direkt über die Liste iterieren.
- 'List' ist nicht sonderlich beschreibend. Gib' dem Kind doch den Namen, den es versteht, z. B. 'nodes' oder so.
- In Zeile 19 machst Du einen append-Aufruf in einem append-Aufruf. Das ist mit Sicherheit nicht optimal. Ohne Code drum herum, kann ich aber auch nicht sagen, wie es besser sein sollte.


HTH
Christian
Braindie
User
Beiträge: 20
Registriert: Mittwoch 10. Juni 2009, 07:54

Danke für eure Tipps.

Die Umsetzung von PEP8 wird wohl bei mir am längsten dauern.

Gruss Stefan
Antworten