That will override the compare items method on all wx.TreeCtrl instances.
···
Galvin <mygalvin@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)
-------------
#!/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)