import wx

class MyTree(wx.TreeCtrl):
    def __init__(self, parent, id, position, size, style):
        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):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title,
                          wx.DefaultPosition, wx.Size(500, 480))

        self.splitter = wx.SplitterWindow(self, -1, style=wx.SP_LIVE_UPDATE)
        
        leftPanel = wx.Panel(self.splitter, -1)
        
        self.tree = MyTree(leftPanel, 1,
                           wx.DefaultPosition,
                           wx.DefaultSize,
                           wx.TR_HIDE_ROOT |
                           wx.TR_HAS_BUTTONS)
        self.tree.SetBackgroundColour('#d8f0d4')

        self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, id=1)

        rightPanel = wx.Panel(self.splitter, -1, style=wx.SUNKEN_BORDER)
        rightPanel.SetBackgroundColour('#f0d4e9')
        
        self.display = wx.StaticText(rightPanel, -1, '',
                                     style=wx.ALIGN_LEFT)
        
        self.splitter.SplitVertically(leftPanel, rightPanel, 200)

        self.splitter.SetMinimumPaneSize(1)         

        leftBox = wx.BoxSizer(wx.VERTICAL)        
        leftBox.Add(self.tree, 1, wx.EXPAND)
        leftPanel.SetSizer(leftBox)
        
        rightBox = wx.BoxSizer(wx.VERTICAL)
        rightBox.Add(self.display, 0, wx.ALL, 10)
        rightPanel.SetSizer(rightBox)

        self.Centre()
       
    def OnSelChanged(self, event):
        # IMPORTANT here, otherwise it will crash
        # We check if the tree and the selected element still exist and are valid
        if not self.tree or not self.tree.IsEmpty(): 
            if isinstance(self.tree, wx.TreeCtrl) and self.tree:
                self.item = event.GetItem()
                if self.item.IsOk(): 
                    self.display.SetLabel(self.tree.GetItemText(self.item))
        event.Skip()
        
class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, 'wx.TreeCtrl (wx.SplitterWindow)')
        frame.Show(True)
        self.SetTopWindow(frame)
        
        return True
    
if __name__ == '__main__':
    app = MyApp(0)
    app.MainLoop()
