wxpython - Nested Notebooks
- by madtowneast
I have been trying to make my nested notebooks a little bit more appealing code wise. At the moment, I got this
#!/usr/bin/env python
import os
import sys
import datetime
import numpy as np
from readmonifile import MonitorFile
from sortmonifile import sort
import wx
class NestedPanelOne(wx.Panel):
    #----------------------------------------------------------------------
    # First notebook that creates the tab to select the component number
    #----------------------------------------------------------------------
    def __init__(self, parent, label, data):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        sizer = wx.BoxSizer(wx.VERTICAL)
        #Loop creating the tabs according to the component name
        nestedNotebook = wx.Notebook(self, wx.ID_ANY)
        for slabel in sorted(data[label].keys()):
            tab = NestedPanelTwo(nestedNotebook, label, slabel, data)
            nestedNotebook.AddPage(tab,slabel)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(nestedNotebook, 1, wx.ALL|wx.EXPAND, 5)
        self.SetSizer(sizer)
class NestedPanelTwo(wx.Panel):
    #------------------------------------------------------------------------------
    # Second notebook that creates the tab to select the main monitoring variables 
    #------------------------------------------------------------------------------
    def __init__(self, parent, label, slabel, data):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        sizer = wx.BoxSizer(wx.VERTICAL)
        nestedNotebook = wx.Notebook(self, wx.ID_ANY)
        for sslabel in sorted(data[label][slabel][data[label][slabel].keys()[0]].keys()):
            tab = NestedPanelThree(nestedNotebook, label, slabel, sslabel, data)
            nestedNotebook.AddPage(tab, sslabel)
        sizer.Add(nestedNotebook, 1, wx.ALL|wx.EXPAND, 5)
        self.SetSizer(sizer)
class NestedPanelThree(wx.Panel):
    #-------------------------------------------------------------------------------
    # Third notebook that creates checkboxes to select the monitoring sub-variables
    #-------------------------------------------------------------------------------
    def __init__(self, parent, label, slabel, sslabel, data):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        labels=[]
        chbox =[]
        chboxdict={}
        for ssslabel in sorted(data[label][slabel][data[label][slabel].keys()[0]][sslabel].keys()):
            labels.append(ssslabel)
        for item in list(set(labels)):
            cb = wx.CheckBox(self, -1, item)
            chbox.append(cb)
            chboxdict[item]=cb
        gridSizer = wx.GridSizer(np.shape(list(set(labels)))[0],3, 5, 5)
        gridSizer.AddMany(chbox)
        self.SetSizer(gridSizer)
########################################################################
class NestedNotebookDemo(wx.Notebook):
    #---------------------------------------------------------------------------------
    # Main notebook creating tabs for the monitored components
    #---------------------------------------------------------------------------------
    def __init__(self, parent, data):
        wx.Notebook.__init__(self, parent, id=wx.ID_ANY, style=
                             wx.BK_DEFAULT
                            )
        for label in sorted(data.keys()):
            print label
            tab = NestedPanelOne(self,label, data)
            self.AddPage(tab, label)
########################################################################
class DemoFrame(wx.Frame):
    #----------------------------------------------------------------------
    # Putting it all together
    #----------------------------------------------------------------------
    def __init__(self,data):
        wx.Frame.__init__(self, None, wx.ID_ANY,
                          "pDAQ monitoring plotting tool",
                          size=(800,400)
                          )
        panel = wx.Panel(self)
        notebook = NestedNotebookDemo(panel, data)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(notebook, 1, wx.ALL|wx.EXPAND, 5)
        panel.SetSizer(sizer)
        self.Layout()
        #Menu Bar to be added later
        '''
        menubar = wx.MenuBar()
        file = wx.Menu()
        file.Append(1, '&Quit', 'Exit Tool')
        menubar.Append(file, '&File')
        self.SetMenuBar(menubar)
        self.Bind(wx.EVT_MENU, self.OnClose, id=1)
        '''
        self.Show()
#----------------------------------------------------------------------
if __name__ == "__main__":
    if len(sys.argv) == 1:
        raise SystemExit("Please specify a file to process")
    for f in sys.argv[1:]:
        data=sort.sorting(f)
        print data['stringHub'].keys()
        print data.keys()
        print data[data.keys()[0]].keys()
    print 'test'
    app = wx.PySimpleApp()
    frame = DemoFrame(data)
    app.MainLoop()
    print 'testend'
and I would like to reduce this whole mess into something that only has three nested for loops, so something like
for label in sorted(data.keys()):
            self.SubNoteBooks[label] = wx.Notebook(self.Notebook, wx.ID_ANY)
            self.Notebook.AddPage(self.SubNoteBooks[label], label)
            for slabel in sorted(data[label].keys()):
                self.SubNoteBooks[label][slabel] = wx.Notebook(self, wx.ID_ANY)
                self.SubNoteBooks[label].AddPage(self.SubNoteBooks[label][slabel], slabel)
                for sslabel in sorted(data[label][slabel][data[label][slabel].keys()[0]].keys()):
                    self.SubNoteBooks[label][slabel][sslabel] = wx.Notebook(self.Notebook, wx.ID_ANY)
                    self.Notebook.AddPage(self.SubNoteBooks[label][slabel][sslabel], sslabel)
I have been trying to fiddle this around but the problem seems to be the line 
self.SubNoteBooks[label][slabel] = wx.Notebook(self, wx.ID_ANY)
I get the error:
Traceback (most recent call last):
  File "./reducelinenumbers.py", line 162, in <module>
    frame = DemoFrame(data)
  File "./reducelinenumbers.py", line 126, in __init__
    self.SubNoteBooks[label][slabel] = wx.Notebook(self, wx.ID_ANY)
TypeError: 'Notebook' object does not support item assignment
I understand why notebook is being type raises a TypeError here. Is there a way around this?
Thanks a bunch in advance.