import  wx

class Treebook(wx.Panel):
    def __init__(self, parent, id, pos=wx.DefaultPosition,
                       size=wx.DefaultSize, style=wx.TR_DEFAULT_STYLE):
        wx.Panel.__init__(self, parent, wx.ID_ANY,
                          wx.DefaultPosition, wx.DefaultSize,
                          style=wx.NO_BORDER|wx.CLIP_CHILDREN|wx.TAB_TRAVERSAL)

        self.tree = wx.TreeCtrl(self, id, pos, size, style)

        self.box = wx.BoxSizer(wx.HORIZONTAL)
        self.box.Add(self.tree, 0, wx.EXPAND, 0)

        self.box.Layout()
        self.SetSizer(self.box)

        self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged)
        if '__WXGTK__' in wx.PlatformInfo:
            self.tree.SetFocus()

    def OnSelChanged(self, evt):
        olditem = evt.GetOldItem()
        if not olditem.IsOk(): return

        item = evt.GetItem()

        oldpage = self.tree.GetPyData(olditem)
        self.box.Remove(oldpage)
        oldpage.Hide()

        newpage = self.tree.GetPyData(item)
        self.box.Add(newpage, 1, wx.EXPAND, 0)
        newpage.Show()

        self.box.Layout()

    def AddRoot(self, text, page):
        item = self.tree.AddRoot(text)
        self.tree.SetPyData(item, page)
        self.box.Add(page, 1, wx.EXPAND, 0)
        self.box.Layout()
        return item

    def AppendItem(self, parentItem, text, page):
        item = self.tree.AppendItem(parentItem, text)
        self.tree.SetPyData(item, page)
        page.Hide()
        return item


if __name__ == '__main__':
    class ColorPanel(wx.Panel):
        def __init__(self, parent, color):
            wx.Panel.__init__(self, parent, -1)
            self.SetBackgroundColour(color)
    
    class Panel(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init__(self, parent, -1)
            box = wx.BoxSizer(wx.VERTICAL)
    
            for i in range(5):
                txt = wx.TextCtrl(self, -1)
                box.Add(txt, 0, wx.EXPAND|wx.ALL, 4)
    
            self.SetSizer(box)
            box.Layout()
    
    class Frame(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None, -1, size=(400,300))
    
            tb = Treebook(self, wx.ID_ANY, size=(200,-1))
    
            isz = (16,16)
            il = wx.ImageList(isz[0], isz[1])
            fldridx = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER,
                                                      wx.ART_OTHER, isz))
            fldropenidx = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN,
                                                          wx.ART_OTHER, isz))
            fileidx = il.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE,
                                                      wx.ART_OTHER, isz))
            smileidx = il.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE,
                                                       wx.ART_OTHER, isz))
    
            tb.tree.SetImageList(il)
            self.il = il
    
            root = tb.AddRoot("The Root Item", Panel(tb))
            tb.tree.SetItemImage(root, fldridx, wx.TreeItemIcon_Normal)
            tb.tree.SetItemImage(root, fldropenidx, wx.TreeItemIcon_Expanded)
    
            child = tb.AppendItem(root, "Item 1", ColorPanel(tb, 'blue'))
            tb.tree.SetItemImage(child, fldridx, wx.TreeItemIcon_Normal)
            tb.tree.SetItemImage(child, fldropenidx, wx.TreeItemIcon_Expanded)
    
            child = tb.AppendItem(child, "Item 2", ColorPanel(tb, 'red'))
            tb.tree.SetItemImage(child, fileidx, wx.TreeItemIcon_Normal)
            tb.tree.SetItemImage(child, smileidx, wx.TreeItemIcon_Expanded)
    
            child = tb.AppendItem(root, "Item 2", ColorPanel(tb, 'green'))
            tb.tree.SetItemImage(child, fileidx, wx.TreeItemIcon_Normal)
            tb.tree.SetItemImage(child, smileidx, wx.TreeItemIcon_Expanded)
    
            tb.tree.Expand(root)


    app = wx.PySimpleApp()
    f = Frame()
    f.Show()
    app.MainLoop()
