wxpython - 嵌套笔记本

时间:2011-11-03 07:41:11

标签: wxpython

我一直试图让我的嵌套笔记本更加吸引人。目前,我得到了这个

#!/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'

我想将整个混乱减少到只有三个嵌套for循环的东西,所以像

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)

我一直在努力摆弄这个问题,但问题似乎就在于行

self.SubNoteBooks[label][slabel] = wx.Notebook(self, wx.ID_ANY)

我收到错误:

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

我理解为什么笔记本是类型会在这里引发一个TypeError。有办法解决这个问题吗?

提前致谢了。

1 个答案:

答案 0 :(得分:0)

你正在使用像字典一样的笔记本,所以它不起作用。 你可以这样做:

from collections import defaultdict

self.sub_nbks = defaultdict(lambda:defauldict(dict))

for label in sorted(data.keys()):
    self.sub_nbks[label]['top']['top'] = wx.Notebook(self.Notebook, wx.ID_ANY)
    self.Notebook.AddPage(self.sub_nbks[label]['top']['top'], label)
    for slabel in sorted(data[label].keys()):
        self.sub_nbks[label][slabel]['top'] = wx.Notebook(self.Notebook, wx.ID_ANY)
        self.sub_nbks[label]['top']['top'].AddPage(self.sub_nbks[label][slabel]['top'], slabel)
        for sslabel in sorted(data[label][slabel].keys()):
            self.sub_nbks[label][slabel][sslabel] = wx.Notebook(self.Notebook, wx.ID_ANY)
            self.sub_nbks[label][slabel]['top'].AddPage(self.sub_nbks[label][slabel][sslabel], sslabel)