python-3.xwxglade

wxglade list tree not showing properly


I am new to wxglade and trying to create a form to show tabs and split window. There are going to be tree lists on the left pane. The issue is that when I open the form, it shows the treelist but the list cannot be collapsed or expanded. When I go to 2nd tab and come back to the first, tree list is shown in small box.

import wx

# Define the tab content as classes:
class TabOne(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)



        self.SetSize((400, 300))
        self.window_1 = wx.SplitterWindow(self, wx.ID_ANY)
        self.window_1_pane_1 = wx.ScrolledWindow(self.window_1, wx.ID_ANY, style=wx.BORDER_RAISED | wx.TAB_TRAVERSAL)
        #self.button_1 = wx.Button(self.window_1_pane_1, wx.ID_ANY, "button_1")

        #t = wx.StaticText(self, -1, "This is the first tab", (100,100)) start list
        il = wx.ImageList(16,16)

        self.fldridx = il.Add(wx.ArtProvider.GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, (16,16)))
        self.fldropenidx = il.Add(wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN,   wx.ART_OTHER, (16,16)))
        self.fileidx = il.Add(wx.ArtProvider.GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, (16,16)))

        self.tree = wx.TreeCtrl(self, style=wx.TR_DEFAULT_STYLE | wx.TR_EDIT_LABELS)

        self.tree.AssignImageList(il)

        root = self.tree.AddRoot("Server")
        self.tree.SetItemData(root, None)
        self.tree.SetItemImage(root, self.fldridx,wx.TreeItemIcon_Normal)
        self.tree.SetItemImage(root, self.fldropenidx,wx.TreeItemIcon_Expanded)

        tree = ["A","B","C","D","E","F","G","H"]

        self.AddTreeNodes(root, tree)

        self.tree.Expand(root)



    def AddTreeNodes(self, parentItem, items):
        for item in items:
            if type(item) == str:
                newItem = self.tree.AppendItem(parentItem, item)
                self.tree.SetItemData(newItem, None)
                #self.tree.SetItemImage(newItem, self.fileidx,wx.TreeItemIcon_Normal)
            else:
                newItem = self.tree.AppendItem(parentItem, item[0])
                self.tree.SetItemPyData(newItem, None)
                #self.tree.SetItemImage(newItem, self.fldridx,wx.TreeItemIcon_Normal)
                self.tree.SetItemImage(newItem, self.fldropenidx,wx.TreeItemIcon_Expanded)

                self.AddTreeNodes(newItem, item[1])



#end list

        self.window_1_pane_2 = wx.Panel(self.window_1, wx.ID_ANY)

        self.window_1_pane_1.SetMinSize((50, 256))
        self.window_1_pane_1.SetBackgroundColour(wx.Colour(216, 216, 191))
        self.window_1_pane_1.SetScrollRate(10, 10)
        self.window_1.SetMinimumPaneSize(20)

        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        #sizer_2.Add(self.button_1, 0, 0, 0)
        sizer1 = wx.BoxSizer(wx.VERTICAL)
        sizer1.Add(self.tree, 20, wx.EXPAND)
        self.SetSizer(sizer1)

        self.window_1_pane_1.SetSizer(sizer_2)
        self.window_1.SplitVertically(self.window_1_pane_1, self.window_1_pane_2)
        sizer_1.Add(self.window_1, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)



class TabTwo(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        t = wx.StaticText(self, -1, "This is the second tab", (20,20))

class TabThree(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        t = wx.StaticText(self, -1, "This is the third tab", (20,20))

class TabFour(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        t = wx.StaticText(self, -1, "This is the last tab", (20,20))


class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="wxPython tabs example @pythonspot.com")

        # Create a panel and notebook (tabs holder)
        p = wx.Panel(self)
        nb = wx.Notebook(p)

        # Create the tab windows
        tab1 = TabOne(nb)
        tab2 = TabTwo(nb)
        tab3 = TabThree(nb)
        tab4 = TabFour(nb)

        # Add the windows to tabs and name them.
        nb.AddPage(tab1, "Tab 1")
        nb.AddPage(tab2, "Tab 2")
        nb.AddPage(tab3, "Tab 3")
        nb.AddPage(tab4, "Tab 4")

        # Set noteboook in a sizer to create the layout
        sizer = wx.BoxSizer()
        sizer.Add(nb, 1, wx.EXPAND)
        p.SetSizer(sizer)





if __name__ == "__main__":
    app = wx.App(redirect=True)
    MainFrame().Show()
    app.MainLoop()

Solution

  • wx.TreeCtrl has built-in horizontal and vertical scroll bars. Therefore, I guess there is no need to use the wx.ScrolledWindow here. I simplify the code for class TabOne to the following:

    class TabOne(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init__(self, parent)
    
            self.SetSize((400, 300))
            self.window_1 = wx.SplitterWindow(self, wx.ID_ANY)
    
    
            il = wx.ImageList(16,16)
            self.fldridx = il.Add(wx.ArtProvider.GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, (16,16)))
            self.fldropenidx = il.Add(wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN,   wx.ART_OTHER, (16,16)))
            self.fileidx = il.Add(wx.ArtProvider.GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, (16,16)))
    
            self.tree = wx.TreeCtrl(self.window_1, style=wx.TR_DEFAULT_STYLE | wx.TR_EDIT_LABELS)
            self.tree.AssignImageList(il)
            root = self.tree.AddRoot("Server")
            self.tree.SetItemData(root, None)
            self.tree.SetItemImage(root, self.fldridx,wx.TreeItemIcon_Normal)
            self.tree.SetItemImage(root, self.fldropenidx,wx.TreeItemIcon_Expanded)
            tree = ["A","B","C","D","E","F","G","H"]
            self.AddTreeNodes(root, tree)
            self.tree.Expand(root)
    
            self.window_1_pane_2 = wx.Panel(self.window_1, wx.ID_ANY)
    
            self.window_1.SetMinimumPaneSize(20)
    
            self.window_1.SplitVertically(self.tree, self.window_1_pane_2)
            sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
            sizer_1.Add(self.window_1, 1, wx.EXPAND, 0)
            self.SetSizer(sizer_1)
    
        def AddTreeNodes(self, parentItem, items):
            for item in items:
                if type(item) == str:
                    newItem = self.tree.AppendItem(parentItem, item)
                    self.tree.SetItemData(newItem, None)
                    #self.tree.SetItemImage(newItem, self.fileidx,wx.TreeItemIcon_Normal)
                else:
                    newItem = self.tree.AppendItem(parentItem, item[0])
                    self.tree.SetItemPyData(newItem, None)
                    #self.tree.SetItemImage(newItem, self.fldridx,wx.TreeItemIcon_Normal)
                    self.tree.SetItemImage(newItem, self.fldropenidx,wx.TreeItemIcon_Expanded)
    
                    self.AddTreeNodes(newItem, item[1])
    

    and now is working as expected.