wxpython - Nested Notebooks

Posted by madtowneast on Stack Overflow See other posts from Stack Overflow or by madtowneast
Published on 2011-11-03T07:41:11Z Indexed on 2011/11/19 9:50 UTC
Read the original article Hit count: 292

Filed under:

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.

© Stack Overflow or respective owner

Related posts about wxpython