[wxPython-users] Re: wxTreeCtrl OnCompareItem

Josiah Carlson jcarlson at uci.edu
Mon Aug 7 10:30:06 PDT 2006


Galvin <mygalvin at yahoo.com> wrote:
> 
> Found the solution. Create a method sortChildren in class TreeCtrl.
> 
> class TreeCtrl(object)
>     ......
>     def sortChildren(self, node):
>         setattr(self.tree.__class__, "OnCompareItems", OnCompareItems)
>         self.tree.SortChildren(node)

That will override the compare items method on all wx.TreeCtrl instances.

As I stated in my previous email, you should subclass wx.TreeCtrl and
override the OnCompareItems method directly.  Here is a variant of your
code that subclasses wx.TreeCtrl, and that sorts items based on the item
label.


 - Josiah


File: App1.py
-------------
#!/usr/bin/env python
#Boa:App:BoaApp

import wx

import Frame1

modules ={'Frame1': [1, 'Main frame of Application', u'Frame1.py']}

class BoaApp(wx.App):
    def OnInit(self):
        wx.InitAllImageHandlers()
        self.main = Frame1.create(None)
        self.main.Show()
        self.SetTopWindow(self.main)
        return True

def main():
    application = BoaApp(0)
    application.MainLoop()

if __name__ == '__main__':
    main()

File: Frame1.py
#Boa:Frame:Frame1

import wx

def create(parent):
    return Frame1(parent)

[wxID_FRAME1, wxID_FRAME1BTNSORT, wxID_FRAME1PANEL1, wxID_FRAME1TREECTRL1,
] = [wx.NewId() for _init_ctrls in range(4)]

class TreeCtrl(wx.TreeCtrl):
    def __init__(self, *args, **kwargs):
        wx.TreeCtrl.__init__(self, *args, **kwargs)
        
        self._imageList = wx.ImageList(height=16, width=16)
        self.SetImageList(self._imageList)

        #setup the images
        isz = (16,16)
        self._imgFolder = self._imageList.Add(wx.ArtProvider_GetBitmap(
                        wx.ART_FOLDER, wx.ART_OTHER, isz))
        self._imgFolderOpen = self._imageList.Add(wx.ArtProvider_GetBitmap(
                        wx.ART_FILE_OPEN, wx.ART_OTHER, isz))
        self._imgFile = self._imageList.Add(wx.ArtProvider_GetBitmap(
                        wx.ART_NORMAL_FILE, wx.ART_OTHER, isz))

    def addRoot(self, label, data):
        root = self.AddRoot(label)
        self.SetPyData(root, data)
        self.SetItemImage(root, self._imgFolder, wx.TreeItemIcon_Normal)
        self.SetItemImage(root, self._imgFolderOpen,
               wx.TreeItemIcon_Expanded)
        return root

    def appendItem(self, parent, label, data):
        child = self.AppendItem(parent, label)
        self.SetPyData(child, data)
        self.SetItemImage(child, self._imgFolder, wx.TreeItemIcon_Normal)
        self.SetItemImage(child, self._imgFolderOpen,
              wx.TreeItemIcon_Expanded)
        return child

    def appendLeaf(self, parent, label, data):
        child = self.AppendItem(parent, label)
        self.SetPyData(child, data)
        self.SetItemImage(child, self._imgFile, wx.TreeItemIcon_Normal)
        return child
    
    def OnCompareItems(self, item1, item2):
        #implement your comparison function here
        return cmp(self.GetItemText(item1), self.GetItemText(item2))

class Frame1(wx.Frame):
    def _init_coll_boxSizer1_Items(self, parent):
        # generated method, don't edit

        parent.AddWindow(self.treeCtrl1, 0, border=0, flag=0)
        parent.AddWindow(self.panel1, 0, border=0, flag=0)

    def _init_sizers(self):
        # generated method, don't edit
        self.boxSizer1 = wx.BoxSizer(orient=wx.VERTICAL)

        self._init_coll_boxSizer1_Items(self.boxSizer1)

    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
              pos=wx.Point(201, 182), size=wx.Size(376, 339),
              style=wx.DEFAULT_FRAME_STYLE, title='Frame1')
        self.SetClientSize(wx.Size(368, 305))

        self.treeCtrl1 = TreeCtrl(id=wxID_FRAME1TREECTRL1, name='treeCtrl1',
              parent=self, pos=wx.Point(0, 0), size=wx.Size(368, 272),
              style=wx.TR_HAS_BUTTONS)

        self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1, name='panel1', parent=self,
              pos=wx.Point(0, 270), size=wx.Size(368, 34),
              style=wx.TAB_TRAVERSAL)

        self.btnSort = wx.Button(id=wxID_FRAME1BTNSORT, label=u'Sort',
              name=u'btnSort', parent=self.panel1, pos=wx.Point(8, 8),
              size=wx.Size(75, 23), style=0)
        self.btnSort.Bind(wx.EVT_BUTTON, self.OnButtonSort,
              id=wxID_FRAME1BTNSORT)

        self._init_sizers()

    def __init__(self, parent):
        self._init_ctrls(parent)

        self.populateTree()

    def populateTree(self):
        self.root = self.treeCtrl1.addRoot("Root", None)
        self.folderA = self.treeCtrl1.appendItem(self.root, "Folder A", None)
        self.folderB = self.treeCtrl1.appendItem(self.root, "Folder B", None)
        z = self.treeCtrl1.appendLeaf(self.folderA, "item Z", None)
        a = self.treeCtrl1.appendLeaf(self.folderA, "item A", None)
        b = self.treeCtrl1.appendLeaf(self.folderA, "item B", None)

    def OnButtonSort(self, event):
        #this will invoke the default OnCompareItems, which I want to override
        self.treeCtrl1.SortChildren(self.folderA)





More information about the wxpython-users mailing list