Probleme mit wx.TreeCtrl/Event Right Down und den Node ID's

Plattformunabhängige GUIs mit wxWidgets.
Antworten
kasen
User
Beiträge: 1
Registriert: Dienstag 4. November 2014, 14:00

Hallo zusammen,

ich habe folgendes Problem und komme einfach nicht weiter bzw. verstehe einfach nicht, warum sich Python an der Stelle so verhält.

Ich versuche die Situation mal vereinfacht darzustellen:

Ich baue einen Tree auf und Speicher mir die einzelnen Nodes in einer Map (Rückgabewert AppendNode). Der Node ist in dem Fall der Indexwert der Map, für welchen weitere Informationen hinterlegt sind.

Nun möchte ich, wenn ich mit der rechten Maustaste in der GUI auf einen Node klicke, diese Informationen aufrufen und verarbeiten.
Ich hole mir also im Event RightDown des TreeCtrl mittles

pt = event.GetPosition();
self.item, flags = self.infotree.HitTest(pt)

den aktuell geklickten Node in self.item.

Wenn ich via GetItemText(self.item) mir den Text ausgeben lasse, so passt das auch immer wunderbar. Self.Item gibt genau den Text aus, den es soll. Allerdings kann ich mit dem Node self.item nicht meine vorher angelegte Map ansprechen, da die "NodeID's" unterschiedlich sind. Wenn ich mir alles via print ausgeben lasse, bekomme ich unterschiedliche Speicheradressen für den jeweils vorher in der Map angelegten und den geklickten Node heraus, obwohl beide via GetItemText den gleichen Text zurückgeben. Auch die PyData ist bei beiden Objekten gleich.

Das entzieht sich leider absolut meinem Verständnis. Ich würde erwarten, dass die Node ID statisch bleibt und ich beim Right Down Event genau die Node ID zurück bekomme, welche auch beim AppendNode zurückgekommen ist.

Kann mich da jemand aufklären? :(

Viele Grüße!
BlackJack

@kasen: Die `TreeItemId`-Objekte lassen sich offenbar nicht als Schlüssel verwenden. Es werden unterschiedliche Objekte geliefert die zwar ``==`` überschreiben aber nicht `hash()`. Wobei wenn man sich `repr()` anschaut auch die gewrappten wxTreeItem-C++-Objekte an unterschiedlichen Adressen liegen, man also anscheinend auch in C++ diese Objekte nicht für eine Abbildung via Hashwert verwenden kann. Da müssen dann wohl die dem Item zugeordneten Daten als Schlüssel herhalten.
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Hallo kasen,
kasen hat geschrieben:...Nun möchte ich, wenn ich mit der rechten Maustaste in der GUI auf einen Node klicke, diese Informationen aufrufen und verarbeiten. ...
Wenn es dir nur darum geht Informationen die an einem Knoten hängen weiterzuverarbeiten, dann brauchst du den Weg nicht über eine "externe Map" zu gehen. Du schreibst was von PyData. Nutzt du diesen Mechanismus schon? Dort kannst du Objekte, Referenzen, IDs oder weitere Informationen usw. "parken". Die kannst du dann einfach zum angeklicken Knoten "abholen".
Das könnte dann sinngemäß z.B. mit einer Klasse als Datencontainer folgendermaßen aussehen (Der Inhalt der <> ist entsprechend zu ersetzen):

Code: Alles auswählen

class Knoten(object):
         '''Knoten als DatenObjekt speichert deine Zusatzinformationen, die nach dem Klick des Knotens weiterverwendet werden könnten.. '''
         ...

'''z.B. in einer anderen Klasse...irgendwo in deinem TreeObjekt, beim Erzeugen neuer Knoten'''
         knoten = Knoten()
         '''Befüllung des Knotens mit deinen gewünschten Daten, die du nach Klick auf den Knoten verarbeiten möchtest, z.B.'''
         knoten.variable_die_mich_interessiert
         ...
         id = self.AppendItem(parent=<ID des Vaterknotens>, text=<Anzuzeigender Text>)
         self.SetPyData(id,knoten)

Auslesen kannst du die Info nach Rechtsklick dann z.B. über sinngemäße Verwendung von

Code: Alles auswählen

self.GetPyData(self.GetSelection()).variable_die_mich_interessiert
oder ggf. auch über den GetPosition-Mechanismus, wie von dir beschrieben.
Ich hoffe, es hilft.
Viele Grüße
Piet
Antworten