Seite 1 von 1

TreeCtrl Reihnfolge ändern

Verfasst: Dienstag 19. Juni 2007, 15:11
von tumbili
Huhu Leute...

Vielleicht bin ich blind, aber ich habe keine Methode entdecken können um die Position eines Items in einem TreeCtrl auszulesen.
Ich habe einen Baum den der Nutzer verändern können soll (also elemente hinzufügen, löschen und eben auch die Reihnfolge der Elemente verändern)

Wenn jetzt ein Element z.B. nach oben verschoben werden soll, brauche ich ja die aktuelle Position um dann InsertItemBefore mit der Position-1 aufrufen zu können.
Vielleicht bin ich blind, aber ich habe keine Methode entdecken können um die aktuelle Position auszulesen...

Gibt es die wirklich nicht? und wie soll man dann elemente verschieben?

danke schonmal :)

Re: TreeCtrl Reihnfolge ändern

Verfasst: Dienstag 19. Juni 2007, 15:31
von gerold
tumbili hat geschrieben:Wenn jetzt ein Element z.B. nach oben verschoben werden soll, brauche ich ja die aktuelle Position um dann InsertItemBefore mit der Position-1 aufrufen zu können.
Hallo tumbili!

``GetPrevSibling`` gibt dir die Vorgänger-ID zurück.
``GetNextSibling`` gibt dir die ID des Nachfolgers zurück.
``GetSelection`` könnte evt. die aktuelle ID zurück geben.

mfg
Gerold
:-)

Verfasst: Mittwoch 20. Juni 2007, 08:39
von tumbili
Danke, so hats funktioniert:

Code: Alles auswählen

	def get_item_position(self, treeItem):
		position = -1
		while treeItem.IsOk():
			position = position + 1
			treeItem = self.GetPrevSibling(treeItem)
		return position

Verfasst: Mittwoch 20. Juni 2007, 10:27
von gerold
Also ich konnte mit "GetSelection" die aktuell ausgewählte TreeItemId herausfinden. Und mit "GetPrevSibling" wird mir die vorherige TreeItemId zurück gegeben. So ganz verstehe ich deine Schleife noch nicht. Du brauchst die Position? Wofür?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import wx


wx.SetDefaultPyEncoding("iso-8859-15")


class MyFrame(wx.Frame):
    
    def __init__(
        self, parent = None, id = -1, title = "Example", size = wx.Size(550, 420)
    ):
        wx.Frame.__init__(self, parent, id, title, size = size)
        
        panel = wx.Panel(self)
        
        vbox_main = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox_main)
        
        tree = wx.TreeCtrl(panel)
        self.tree = tree
        vbox_main.Add(tree, 1, wx.EXPAND | wx.ALL, 5)
        
        root = tree.AddRoot("Root")
        first_child = tree.AppendItem(root, "Erster")
        second_child = tree.AppendItem(root, "Zweiter")
        
        btn_insert_before = wx.Button(panel, label = "before")
        vbox_main.Add(btn_insert_before)
        btn_insert_before.Bind(wx.EVT_BUTTON, self.insert_before)
        
        btn_insert_after = wx.Button(panel, label = "after")
        vbox_main.Add(btn_insert_after)
        btn_insert_after.Bind(wx.EVT_BUTTON, self.insert_after)
    
    
    def insert_before(self, event):
        current = self.tree.GetSelection()
        parent = self.tree.GetItemParent(current)
        
        if current.IsOk() and parent.IsOk():
            prev = self.tree.GetPrevSibling(current)
            if prev.IsOk():
                self.tree.InsertItem(parent, prev, "before")
            else:
                self.tree.InsertItemBefore(parent, 0, "before")
    
    
    def insert_after(self, event):
        current = self.tree.GetSelection()
        parent = self.tree.GetItemParent(current)
        
        if current.IsOk() and parent.IsOk():
            self.tree.InsertItem(parent, current, "after")


def main():
    """Testing"""
    
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
Vielleicht kannst du damit etwas anfangen.

mfg
Gerold
:-)

Verfasst: Mittwoch 20. Juni 2007, 11:35
von tumbili
mist, ich dachte man muss an InsertItemBefore die position übergeben! Dabei reicht es, das Item vor dem man das neue einfügen möchte, zu übergeben...

Funktionieren tut meine Lösung zwar auch, aber das Item zu übergeben is irgendwie einfacher ;)