wx tree doppelte Einträge löschen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
HarryPython
User
Beiträge: 60
Registriert: Freitag 8. Juni 2007, 07:39

Hi @ all,

Ich hab einen wx-Tree in dem sich doppelte Einträge befinden. Das sieht wie folgt aus:

Code: Alles auswählen

Mehrfamilienhaus
   |
   |----->Familie_1
   |         |
   |         |----->Peter
   |         |----->Hans
   |         |----->Peter
   |
   |----->Familie_2
   |         |
   |         |----->Peter
   |         |----->Horst
   |
   |----->Familie_3
(man, ist das ein schönes Beispiel gewurden..und erst der Tree...schööön) :lol:

Problem ist, dass es nur einen Peter in Familie_1 gibt und der Peter in Familie_2 natürlich ein anderer ist. Wie werd ich also den Typen in Familie_1 los?
Hatte dabei an sowas wie list(set(Liste)) gedacht nur halt für einen Tree.
Auf wxPython.org hab ich auch schon alle Methoden durchsucht.

Kann mir da jemand helfen?

mfg HarryPython

Edit (Leonidas): Verschoben.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

HarryPython hat geschrieben:

Code: Alles auswählen

Mehrfamilienhaus
   |
   |----->Familie_1
   |         |
   |         |----->Peter
   |         |----->Hans
   |         |----->Peter
   |
   |----->Familie_2
   |         |
   |         |----->Peter
   |         |----->Horst
   |
   |----->Familie_3
Hallo HarryPython!

Wer schreibt diesen doppelten Namen rein? Du im Quellcode oder der Benutzer?

Wenn du ihn im Quellcode rein schreibst, dann kümmere dich darum, bevor du es in den Tree schreibst.

Wenn es der Benutzer rein schreibt, dann weißt du ja nicht, ob es nicht zwei Peter gibt -- oder doch?

Bei Benutzereingaben könntest du es mal mit einem Event versuchen. Vielleicht kannst du ja eine Sicherheitsabfrage dazwischen schieben.

wx.EVT_TREE_END_LABEL_EDIT

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
HarryPython
User
Beiträge: 60
Registriert: Freitag 8. Juni 2007, 07:39

Hi Gerold

Ja...Ich schreibe das da so doof rein. :oops:
Mir ist aber auch noch nichts besseres eingefallen. Ich lese das ganze aus einem xls File. Und das sieht auf das Beispiel bezogen dann so aus:

Code: Alles auswählen

------------------------------------------------
Familie_1  | Peter | mit einem Bein         
Familie_1  | Hans  | mit allen Gliedmaßen
Familie_2  | Horst | nur Arme                 
Familie_2  | Peter | mit 3 Beinen              
Familie_1  | Peter | mit einem Arm         
------------------------------------------------

Code: Alles auswählen

        #Öffnet die Excel-Datei und die erste Tabelle
        book = xlrd.open_workbook(self.xls_pfad)
        self.tabelle1 = book.sheet_by_index(0)
        self.zeilen_anzahl = self.tabelle1.nrows
        haupt_knoten = self.tree_ctrl_1.AddRoot("Mehrfamilienhaus")
        
        
        #Holt alle Familien aus der xls Spalte Familie und übergibt ohne doppelte an Familie_liste
        Familie_spalte=[]
        for x in self.tabelle1.col_values(0,0,self.zeilen_anzahl): 
            Familie_spalte.append(x) 
        Familie_liste = list(set(Familie_spalte))    
        
        #Fügt alle Familien aus der Liste in den Tree
        for y in Familie_liste:
            Familie_knoten = self.tree_ctrl_1.AppendItem(haupt_knoten,y)
            
            #Prüft welcher Name zu welcher Familie gehört und fügt ihn dann zum Tree hinzu
            for i in range(self.zeilen_anzahl):
                if y == self.tabelle1.cell_value(i,0):
                   SG_child = self.tree_ctrl_1.AppendItem(Familie_knoten,self.tabelle1.cell_value(i,1))

                      
        self.tree_ctrl_1.ExpandAll()
Der User darf die Reihenfolge wie er in das xls-File schreibt frei wählen.
Und hinter den Namen der Familien ist auch ein Unterschied aber im Tree sind die Gliedmaßen nicht von Interesse, also nur einmal der Name. Da ich mit, eine Liste erstellen und doppelte rauslöchen, schon einen Ansatz hatte, hab ich gehofft es gibt einen einfachen Befehl. Aber sieht wohl so aus als müsste ich meinen Ansatz nochmal überdenken.

Gruß Harry
BlackJack

Vielleicht eine Stufe zwischen XLS-Datei und GUI einziehen, also das Datenmodell unabhängig von Speicherung und GUI machen. In der Datenklasse kann man dann auch die notwendigen Prüfungen durchführen.
HarryPython
User
Beiträge: 60
Registriert: Freitag 8. Juni 2007, 07:39

Hi

Ja an sowas hab ich auch schon gedacht. Das erstmal alles in einer Datei zu hinterlegen, aus der ich dann leichter lesen kann, als ständig in dem Excel-File hin und her zu springen. Hatte an Listen in Listen gedacht. Aber das Probelm ist immer noch die Geschichte mit der Doppelbelegung. Ich möchte halt einfach keine Vorgaben für das erstellen dieser excel-Tabelle machen. Daher muss ich auch von solch Chaos ausgehen. Hast du an was bestimmtes gedacht bei dem zwischenspeichern? Oder gibt es die Möglichkeit die Excel-Tabelle von Python aus alle Einträge nach einer Spalte alphabetisch zu ordnen?


Gruß
BlackJack

Bei dem "zwischenspeichern" habe ich an ein Objekt gedacht. Weiss nicht wieso Du auf eine Datei kommst!? Eben eine Klasse die Deine Daten modelliert. Wie man das macht hängt ganz von den Daten, deren Struktur und die Art wie man sie verwenden will, ab. Auf jeden Fall kann man bei dem Datenobjekt dann dafür sorgen, dass mehrfach auftretende Namen entsprechend behandelt werden. Ausnahme auslösen, mehrfaches Vorkommen einfach unter den Tisch fallen lassen oder die Daten miteinander kombinieren. Was auch immer.
HarryPython
User
Beiträge: 60
Registriert: Freitag 8. Juni 2007, 07:39

:lol: Kein Plan wie ich auf Datei komme. Ist doch schon in einer. :roll:

Setz mich jetzt mal ran und schreib ne Klasse die nur aus der xls-Datei ließt. Wohl auch besser so, da es noch weiter 6 Spalten gibt. Das wird die weitere Bearbeitung auch einfacher machen.

Denk mal sowas meinst du:

Code: Alles auswählen

Mehrfamilienhaus.Familie.Name.Gliedmaßen
Da muss man als Elektrotechnik Student ja auch erstmal drauf kommen. :wink:

Danke schonmal.

Meld mich dann nochmal mit der Lösung....oder einem neuen Problem. :wink:
Antworten