TreeCtrl Reihnfolge ändern

Plattformunabhängige GUIs mit wxWidgets.
Antworten
tumbili
User
Beiträge: 27
Registriert: Donnerstag 31. Mai 2007, 14:38

Dienstag 19. Juni 2007, 15:11

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 :)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Dienstag 19. Juni 2007, 15:31

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
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
tumbili
User
Beiträge: 27
Registriert: Donnerstag 31. Mai 2007, 14:38

Mittwoch 20. Juni 2007, 08:39

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Mittwoch 20. Juni 2007, 10:27

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
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
tumbili
User
Beiträge: 27
Registriert: Donnerstag 31. Mai 2007, 14:38

Mittwoch 20. Juni 2007, 11:35

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 ;)
Antworten