## page was renamed from TextCtrlAutoComplete (Phoenix) = How to create a tree control (Phoenix) = '''Keywords :''' Tree control. <<TableOfContents>> -------- = Introduction : = wx.TreeCtrl displays data in a hierarchy. First of all we must create a root item. {{{ root = self.tree.AddRoot('Programmer') }}} In our case, root item will not be displayed, because we used wx.TR_HIDE_ROOT flag in our constructor. {{{ self.tree = wx.TreeCtrl(panel1, 1, wx.DefaultPosition, (-1,-1), wx.TR_HIDE_ROOT|wx.TR_HAS_BUTTONS) }}} We add items to the root item with{{{AppendItem()}}} method. {{{ os = self.tree.AppendItem(root, 'Operating Systems') pl = self.tree.AppendItem(root, 'Programming Languages') tk = self.tree.AppendItem(root, 'Toolkits') }}} We can similarly create several levels by simply adding items to existing items. We catch events with wx.EVT_TREE_SEL_CHANGED() event handler. {{{ wx.EVT_TREE_SEL_CHANGED(self.tree, 1, self.OnSelChanged) }}} Various constructor style flags: * TR_NO_BUTTONS * TR_HAS_BUTTONS * TR_NO_LINES * TR_LINES_AT_ROOT * TR_SINGLE * TR_MULTIPLE * TR_EXTENDED * TR_HAS_VARIABLE_ROW_HEIGHT * TR_EDIT_LABELS * TR_HIDE_ROOT * TR_ROW_LINES * TR_FULL_ROW_HIGHLIGHT * TR_DEFAULT_STYLE * TR_TWIST_BUTTONS * TR_MAC_BUTTONS * TR_AQUA_BUTTONS (info by '''ZetCode / Jan Bodnar'''). -------- = Demonstrating : = __'''''Tested''' py3.x, wx4.x and Win10. ''__ Are you ready to use some samples ? ;) Test, modify, correct, complete, improve and share your discoveries ! (!) -------- == Sample one : == === With wx.Panel === {{attachment:img_sample_one_a.png}} {{{#!python # Sample_one_a.py """ Author : Jan Bodnar Website : zetcode.com """ import wx # class MyFrame # class MyApp #--------------------------------------------------------------------------- class MyFrame(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(500, 480)) self.SetIcon(wx.Icon('./icons/wxwin.ico', wx.BITMAP_TYPE_ICO)) #------------ panel1 = wx.Panel(self, -1, style=wx.WANTS_CHARS) panel2 = wx.Panel(self, -1, style=wx.WANTS_CHARS) panel2.SetBackgroundColour('#c4c4c4') #------------ self.tree = wx.TreeCtrl(panel1, 1, wx.DefaultPosition, wx.DefaultSize, wx.TR_HIDE_ROOT | wx.TR_HAS_BUTTONS) self.tree.SetBackgroundColour('#cce8ff') root = self.tree.AddRoot('Programmer') os = self.tree.AppendItem(root, 'Operating Systems') pl = self.tree.AppendItem(root, 'Programming Languages') tk = self.tree.AppendItem(root, 'Toolkits') cl = self.tree.AppendItem(pl, 'Compiled languages') sl = self.tree.AppendItem(pl, 'Scripting languages') self.tree.AppendItem(os, 'Linux') self.tree.AppendItem(os, 'FreeBSD') self.tree.AppendItem(os, 'OpenBSD') self.tree.AppendItem(os, 'NetBSD') self.tree.AppendItem(os, 'Solaris') self.tree.AppendItem(cl, 'Java') self.tree.AppendItem(cl, 'C++') self.tree.AppendItem(cl, 'C') self.tree.AppendItem(cl, 'Pascal') self.tree.AppendItem(sl, 'Python') self.tree.AppendItem(sl, 'Ruby') self.tree.AppendItem(sl, 'Tcl') self.tree.AppendItem(sl, 'PHP') self.tree.AppendItem(tk, 'Qt') self.tree.AppendItem(tk, 'MFC') self.tree.AppendItem(tk, 'wxPython') self.tree.AppendItem(tk, 'GTK+') self.tree.AppendItem(tk, 'Swing') self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, self.tree) self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) #------------ self.display = wx.StaticText(panel2, -1, '', (10, 10), style=wx.ALIGN_CENTRE) #------------ hbox = wx.BoxSizer(wx.HORIZONTAL) vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(self.tree, 1, wx.EXPAND) hbox.Add(panel1, 1, wx.EXPAND) hbox.Add(panel2, 1, wx.EXPAND) panel1.SetSizer(vbox) self.SetSizer(hbox) #------------ self.Centre() #----------------------------------------------------------------------- def OnSelChanged(self, event): self.item = event.GetItem() self.display.SetLabel(self.tree.GetItemText(self.item)) self.tree.GetItemText(self.item) event.Skip() def OnCloseWindow(self, event): self.Destroy() #--------------------------------------------------------------------------- class MyApp(wx.App): def OnInit(self): frame = MyFrame(None, -1, 'wx.TreeCtrl (wx.Panel)') frame.Show(True) self.SetTopWindow(frame) return True #--------------------------------------------------------------------------- if __name__ == '__main__': app = MyApp(0) app.MainLoop() }}} -------- === With wx.SplitterWindow === {{attachment:img_sample_one_b.png}} {{{#!python # Sample_one_b.py """ Author : Adil Hasan https://wiki.wxpython.org/AnotherTutorialTreeCtrlComment """ import wx # class MyTree # class MyFrame # class MyApp #--------------------------------------------------------------------------- class MyTree(wx.TreeCtrl): """ Our customized TreeCtrl class. """ def __init__(self, parent, id, position, size, style): """ Initialize our tree. """ wx.TreeCtrl.__init__(self, parent, id, position, size, style) root = self.AddRoot('Programmer') os = self.AppendItem(root, 'Operating Systems') pl = self.AppendItem(root, 'Programming Languages') tk = self.AppendItem(root, 'Toolkits') cl = self.AppendItem(pl, 'Compiled languages') sl = self.AppendItem(pl, 'Scripting languages') self.AppendItem(os, 'Linux') self.AppendItem(os, 'FreeBSD') self.AppendItem(os, 'OpenBSD') self.AppendItem(os, 'NetBSD') self.AppendItem(os, 'Solaris') self.AppendItem(cl, 'Java') self.AppendItem(cl, 'C++') self.AppendItem(cl, 'C') self.AppendItem(cl, 'Pascal') self.AppendItem(sl, 'Python') self.AppendItem(sl, 'Ruby') self.AppendItem(sl, 'Tcl') self.AppendItem(sl, 'PHP') self.AppendItem(tk, 'Qt') self.AppendItem(tk, 'MFC') self.AppendItem(tk, 'wxPython') self.AppendItem(tk, 'GTK+') self.AppendItem(tk, 'Swing') #--------------------------------------------------------------------------- class MyFrame(wx.Frame): """ Our customized window class. """ def __init__(self, parent, id, title): """ Initialize our window. """ wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(500, 480)) self.SetIcon(wx.Icon('./icons/wxwin.ico', wx.BITMAP_TYPE_ICO)) #------------ # Create a splitter window. self.splitter = wx.SplitterWindow(self, -1, style=wx.SP_LIVE_UPDATE) # Create the left panel. leftPanel = wx.Panel(self.splitter, -1) # Create our tree and put it into the left panel. self.tree = MyTree(leftPanel, 1, wx.DefaultPosition, wx.DefaultSize, wx.TR_HIDE_ROOT | wx.TR_HAS_BUTTONS) self.tree.SetBackgroundColour('#d8f0d4') # Bind the OnSelChanged method to the tree. self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, id=1) # Create the right panel. rightPanel = wx.Panel(self.splitter, -1, style=wx.SUNKEN_BORDER) rightPanel.SetBackgroundColour('#f0d4e9') # Create a widget to display static text # and store it in the right panel. self.display = wx.StaticText(rightPanel, -1, '', style=wx.ALIGN_LEFT) # Put the left and right panes into the split window. self.splitter.SplitVertically(leftPanel, rightPanel, 200) # Minimum size of subwindow. self.splitter.SetMinimumPaneSize(1) #------------ # Create a box sizer that will contain the left panel contents. leftBox = wx.BoxSizer(wx.VERTICAL) # Add the tree to the box sizer. leftBox.Add(self.tree, 1, wx.EXPAND) # Set the size of the right panel to that required by the tree. leftPanel.SetSizer(leftBox) # Create the right box sizer that will contain the panel's contents. rightBox = wx.BoxSizer(wx.VERTICAL) # Add the display widget to the right panel. rightBox.Add(self.display, 0, wx.ALL, 10) # Set the size of the right panel to that # required by the display widget. rightPanel.SetSizer(rightBox) #------------ # Create the window in the centre of the screen. self.Centre() #----------------------------------------------------------------------- def OnSelChanged(self, event): """ Method called when selected item is changed. """ # Get the selected item object. item = event.GetItem() # Display the selected item text in the text widget. self.display.SetLabel(self.tree.GetItemText(item)) #--------------------------------------------------------------------------- class MyApp(wx.App): """ Our application class. """ def OnInit(self): """ Initialize by creating the split window with the tree. """ frame = MyFrame(None, -1, 'wx.TreeCtrl (wx.SplitterWindow)') frame.Show(True) self.SetTopWindow(frame) return True #--------------------------------------------------------------------------- if __name__ == '__main__': app = MyApp(0) app.MainLoop() }}} -------- == Sample two == {{attachment:img_sample_two.png}} {{{#!python # sample_two.py """ Author : Rahul Sabharwal https://www.geeksforgeeks.org/wxpython-treectrl/ """ import wx # class MyFrame # class MyApp #--------------------------------------------------------------------------- class MyFrame(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, -1, title) self.SetIcon(wx.Icon('./icons/wxwin.ico', wx.BITMAP_TYPE_ICO)) #------------ # Tree control self.tree = wx.TreeCtrl(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize) self.tree.SetBackgroundColour('#d9f3fa') # Add root to tree self.root = self.tree.AddRoot('Root ') # Add item to root self.tree.AppendItem(self.root, 'Child 1') self.tree.AppendItem(self.root, 'Child 2') self.tree.AppendItem(self.root, 'Child 3') self.tree.AppendItem(self.root, 'Child 4') self.tree.AppendItem(self.root, 'Child 5') self.tree.AppendItem(self.root, 'Child 6') self.tree.AppendItem(self.root, 'Child 7') self.tree.AppendItem(self.root, 'Child 8') # Expand tree self.tree.Expand(self.root) #------------ # Show frame self.Show() #--------------------------------------------------------------------------- class MyApp(wx.App): def OnInit(self): frame = MyFrame(None, -1, 'wx.TreeCtrl') frame.Show(True) self.SetTopWindow(frame) return True #--------------------------------------------------------------------------- app = MyApp(0) app.MainLoop() }}} -------- == Sample three == {{attachment:img_sample_three.png}} {{{#!python # sample_three.py """ Author : Rahul Sabharwal https://www.geeksforgeeks.org/wxpython-assignimagelist-method-in-wx-treectrl/?ref=rp """ import wx # class MyFrame # class MyApp #--------------------------------------------------------------------------- class MyFrame(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, -1, title) self.SetIcon(wx.Icon('./icons/wxwin.ico', wx.BITMAP_TYPE_ICO)) #------------ # Tree control self.tree = wx.TreeCtrl(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize) self.tree.SetBackgroundColour('#f1f2f2') # Create imagelist il = wx.ImageList(16, 16) # Add images to image list one = il.Add(wx.Image('./bitmaps/plus.png', wx.BITMAP_TYPE_PNG).Scale(16, 16).ConvertToBitmap()) two = il.Add(wx.Image('./bitmaps/close.png').Scale(16, 16).ConvertToBitmap()) # Asign image list to tree self.tree.AssignImageList(il) # Add a root node to tree self.root = self.tree.AddRoot('Root ', 0) # Add item to self.root self.tree.AppendItem(self.root, 'Item 1', 1) self.tree.AppendItem(self.root, 'Item 2', 1) self.tree.AppendItem(self.root, 'Item 3', 1) self.tree.AppendItem(self.root, 'Item 4', 1) self.tree.AppendItem(self.root, 'Item 5', 1) self.tree.AppendItem(self.root, 'Item 6', 1) self.tree.AppendItem(self.root, 'Item 7', 1) self.tree.AppendItem(self.root, 'Item 8', 1) # Expand tree self.tree.Expand(self.root) #------------ # Show frame self.Show() #--------------------------------------------------------------------------- class MyApp(wx.App): def OnInit(self): frame = MyFrame(None, -1, 'wx.TreeCtrl (AssignImageList)') frame.Show(True) self.SetTopWindow(frame) return True #--------------------------------------------------------------------------- app = MyApp(0) app.MainLoop() }}} -------- == Sample four == {{attachment:img_sample_four.png}} {{{#!python # sample_four.py """ Author : Rahul Sabharwal https://www.geeksforgeeks.org/wxpython-collapse-method-wx-treectrl/?ref=rp """ import wx # class MyTree # class MyTreePanel # class MyFrame # class MyApp #--------------------------------------------------------------------------- class MyTree(wx.TreeCtrl): def __init__(self, parent, id, pos, size, style): wx.TreeCtrl.__init__(self, parent, id, pos, size, style) #--------------------------------------------------------------------------- class MyTreePanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent) # Create tree control self.tree = MyTree(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TR_HAS_BUTTONS) self.tree.SetBackgroundColour('#f8f094') # Add root to self.tree self.root = self.tree.AddRoot('Root') # Add item to self.root item = self.tree.AppendItem(self.root, 'Item 1') item = self.tree.AppendItem(self.root, 'Item 2') item = self.tree.AppendItem(self.root, 'Item 3') item = self.tree.AppendItem(self.root, 'Item 4') item = self.tree.AppendItem(self.root, 'Item 5') item = self.tree.AppendItem(self.root, 'Item 6') item = self.tree.AppendItem(self.root, 'Item 7') item = self.tree.AppendItem(self.root, 'Item 8') # Expand whole tree self.tree.Expand(self.root) #------------ # Add button in panel self.btn = wx.Button(self, 1, "&Collapse") # Bind event with self.btn self.btn.Bind(wx.EVT_BUTTON, self.OnClick) #------------ sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.tree, 1, wx.EXPAND) sizer.Add(self.btn, 0, wx.EXPAND) self.SetSizer(sizer) #----------------------------------------------------------------------- def OnClick(self, event): # Collapse root self.tree.Collapse(self.root) #--------------------------------------------------------------------------- class MyFrame(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, -1, title) self.SetIcon(wx.Icon('./icons/wxwin.ico', wx.BITMAP_TYPE_ICO)) #------------ panel = MyTreePanel(self) #------------ # Show frame self.Show() #--------------------------------------------------------------------------- class MyApp(wx.App): def OnInit(self): frame = MyFrame(None, -1, 'wx.TreeCtrl (Collapse)') frame.Show(True) self.SetTopWindow(frame) return True #--------------------------------------------------------------------------- app = MyApp(0) app.MainLoop() }}} -------- == Sample five == {{attachment:img_sample_five.png}} {{{#!python # sample_five.py """ Author : Rahul Sabharwal https://www.geeksforgeeks.org/wxpython-clearfocuseditem-method-in-wx-treectrl/?ref=rp """ import wx # class MyTree # class MyFrame # class MyApp #--------------------------------------------------------------------------- class MyTree(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent) # create Tree Control in frame self.tree = wx.TreeCtrl(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TR_HAS_BUTTONS) self.tree.SetBackgroundColour('#fddef5') # Create root for Tree Control self.root = self.tree.AddRoot('Root') # Add item to root item = self.tree.AppendItem(self.root, 'Item 1') item = self.tree.AppendItem(self.root, 'Item 2') item = self.tree.AppendItem(self.root, 'Item 3') item = self.tree.AppendItem(self.root, 'Item 4') item = self.tree.AppendItem(self.root, 'Item 5') item = self.tree.AppendItem(self.root, 'Item 6') item = self.tree.AppendItem(self.root, 'Item 7') item = self.tree.AppendItem(self.root, 'Item 8') # Clear focused item self.tree.ClearFocusedItem() # expand tree self.tree.Expand(self.root) #------------ sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.tree, 1, wx.EXPAND) self.SetSizer(sizer) #--------------------------------------------------------------------------- class MyFrame(wx.Frame): """ Main root frame for tree control. """ def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, -1, title) self.SetIcon(wx.Icon('./icons/wxwin.ico', wx.BITMAP_TYPE_ICO)) #------------ panel = MyTree(self) #------------ # Show frame self.Show() #--------------------------------------------------------------------------- class MyApp(wx.App): def OnInit(self): frame = MyFrame(None, -1, 'wx.TreeCtrl (ClearFocusedItem)') frame.Show(True) self.SetTopWindow(frame) return True #--------------------------------------------------------------------------- app = MyApp(0) app.MainLoop() }}} -------- == Sample six == {{attachment:img_sample_six.png}} {{{#!python # sample_six.py """ Author : Rahul Sabharwal https://www.geeksforgeeks.org/wxpython-collapseallchildren-method-in-wx-treectrl/?ref=rp """ import wx # class MyTree # class MyTreePanel # class MyFrame # class MyApp #--------------------------------------------------------------------------- class MyTree(wx.TreeCtrl): def __init__(self, parent, id, pos, size, style): wx.TreeCtrl.__init__(self, parent, id, pos, size, style) #--------------------------------------------------------------------------- class MyTreePanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent) # Create Tree Control self.tree = MyTree(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TR_HAS_BUTTONS) self.tree.SetForegroundColour('#ffffff') self.tree.SetBackgroundColour('#000000') # Add root to Tree Control self.root = self.tree.AddRoot('Root') # Add item to root self.itm = self.tree.AppendItem(self.root, 'Item') # Add item to 'itm' self.itm2 = self.tree.AppendItem(self.itm, "Sub Item") # Add child item to itm2 self.itm3 = self.tree.AppendItem(self.itm2, "Another Item") self.itm4 = self.tree.AppendItem(self.itm2, "Another Item") self.itm5 = self.tree.AppendItem(self.itm2, "Another Item") self.itm6 = self.tree.AppendItem(self.itm2, "Another Item") self.itm7 = self.tree.AppendItem(self.itm2, "Another Item") self.itm8 = self.tree.AppendItem(self.itm2, "Another Item") self.itm9 = self.tree.AppendItem(self.itm2, "Another Item") # Expand whole tree self.tree.Expand(self.root) #------------ # Add button in frame self.btn = wx.Button(self, 1, "Collapse") # Bind event function with button self.btn.Bind(wx.EVT_BUTTON, self.OnClick) #------------ sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.tree, 1, wx.EXPAND) sizer.Add(self.btn, 0, wx.EXPAND) self.SetSizer(sizer) #----------------------------------------------------------------------- def OnClick(self, event): # Collapse all children of itm recursively self.tree.CollapseAllChildren(self.itm) #--------------------------------------------------------------------------- class MyFrame(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, -1, title) self.SetIcon(wx.Icon('./icons/wxwin.ico', wx.BITMAP_TYPE_ICO)) #------------ panel = MyTreePanel(self) #------------ # Show frame self.Show() #--------------------------------------------------------------------------- class MyApp(wx.App): def OnInit(self): frame = MyFrame(None, -1, 'wx.TreeCtrl (CollapseAllChildren)') frame.Show(True) self.SetTopWindow(frame) return True #--------------------------------------------------------------------------- app = MyApp(0) app.MainLoop() }}} -------- = Download source = [[attachment:source.zip]] -------- = Additional Information = '''Link :''' -------- https://wiki.wxpython.org/TitleIndex https://docs.wxpython.org/ -------- = Thanks to = Jan Bodnar (sample_one.py coding), Adil Hasan (sample_two.py coding), Rahul Sabharwal (sample_three /four / five / six.py coding), the wxPython community... -------- = About this page = Date(d/m/y) Person (bot) Comments : 21/01/21 - Ecco (Created page for wxPython Phoenix). -------- = Comments = - blah, blah, blah....