Here's a demo, illiustrating the problem.
from wxPython.wx import *
import UserList
import string
import time
def menuItem( app, menu, label, command, help):
id=wxNewId()
menu.Append(id, label, help )
EVT_MENU( app, id, command)
def menuSeparator(app, menu):
menu.AppendSeparator()
class UiMenus:
def __init__(self,parent,controller):
c=controller
parent.mainmenu = wxMenuBar()
file = wxMenu()
menuItem(parent, file, '&Exit', c.fileExit, '')
parent.mainmenu.Append (file, '&File')
parent.SetMenuBar (parent.mainmenu) # Attach the menu bar to window.
class UiToolBars:
def __init__(self,app,controller):
c=controller
tb = app.CreateToolBar(wxTB_HORIZONTAL|wxNO_BORDER)
id = wxNewId()
tb.AddControl(wxButton(
tb, id, 'New Panel', wxPoint(0,0),wxSize(80,20 )))
EVT_BUTTON(app, id, c.toolNewPanel)
id = wxNewId()
tb.AddControl(wxButton(
tb, id, 'New Addon', wxPoint(0,20),wxSize(80,20)))
EVT_BUTTON(app, id, c.toolNewPanelAddon)
tb.Realize()
class UiStatusBar:
def __init__(self,parent):
self.parent=parent
sb = parent.CreateStatusBar(2)
parent.SetStatusText("This is the statusbar",0)
sb.SetStatusWidths([-1, 150])
self.timer = wxPyTimer(self.Notify)
self.timer.Start(1000)
self.Notify()
def Notify(self):
t = time.localtime(time.time())
st = time.strftime(" %d-%b-%Y %I:%M:%S", t)
self.parent.SetStatusText(st, 1)
def __del__(self):
self.timer.Stop()
del self.timer
class Addon:
def __init__(self):
self.data=''
class Item:
def __init__(self):
self.description = ''
self.sessionsList=[]
def update ( self, description, completed, activateDate, status):
self.description = description
self.completed = completed
self.activateDate = activateDate
self.activationStatus = status
def addAddon( self, session):
self.sessionsList.add(session)
class Data:
def __init__(self):
self.ItemList=ItemList()
class Tools:
def __init__(self,data):
self.data=data
self.ui=None
def setUi(self, ui):
self.ui = ui
def fileExit(self, event):
print "FileExit Not implemented"
print self
print event
def toolNewPanel(self, event):
#print self.toolNewPanel
newItem=Item()
self.ui.content.addItem(newItem)
def toolNewPanelAddon(self, event):
#print self.toolNewPanelAddon
newPanelAddon=None
self.ui.content.addAddon(newPanelAddon)
class Addon:
def __init__(self,parentWindow,parentSizer,item=None):
self.sizer= wxBoxSizer(wxHORIZONTAL)
self.description = wxTextCtrl(parentWindow, -1,
'detail description',
wxPoint(-1,-1), wxSize(150,20),
0, wxDefaultValidator)
self.sizer.Add(self.description,0)
parentSizer.Add(self.sizer)
class AddonList:
def __init__(self,parent,parentSizer,item=None):
self.parentWindow=parent
self.sessionList = []
self.sizer = wxBoxSizer(wxVERTICAL)
parentSizer.Add(self.sizer)
class ItemFrame(wxPanel):
def __init__(self,parent,id=-1,item=None):
wxPanel.__init__(self, parent, id, wxPoint(-1,-1), wxSize(800,60),
wxSUNKEN_BORDER)
self.sizer = wxBoxSizer(wxVERTICAL)
self.description = wxTextCtrl(self, -1, 'description',
wxPoint(-1,-1), wxSize(450,60),
0, wxDefaultValidator)
id=wxNewId()
self.sizer.Add(self.description,0)
self.addonList = AddonList(self,self.sizer,item)
self.SetAutoLayout(1)
self.sizer.Layout()
class UiContent(wxScrolledWindow):
def __init__(self,app,id,data=None):
wxScrolledWindow.__init__(self,app, -1)
self.parent=app
self.panels = []
self.sizer = wxBoxSizer(wxVERTICAL)
self.SetSizer(self.sizer)
self.SetAutoLayout(1)
self.Show(true)
self.SetScrollbars(5,5,50,0)
self.currentItem=None
self.n=0
def addItem(self,item=None):
id=wxNewId()
self.currentItem = f =ItemFrame(self,id,item)
self.n=self.n+1
self.sizer.Add(f,0, wxEXPAND)
self.panels.append(f)
self.SetClientSize(self.parent.GetClientSize())
self.setScrollbars
def addAddon(self,addon=None):
id=wxNewId()
s=Addon(self.currentItem,
self.currentItem.addonList.sizer,
addon)
self.currentItem.SetClientSize(self.currentItem.sizer.CalcMin())
self.currentItem.sizer.Layout()
#self.sizer.Layout() Adding this makes the new addon invisible
self.setScrollbars()
def setScrollbars(self):
self.SetScrollbars(5,5,20,self.n*39)
class Ui(wxFrame):
def __init__(self, parent, id, title):
wxFrame.__init__(self, parent, -1, title, size = (500, 600),
style=wxDEFAULT_FRAME_STYLE)
def start(self, data, controller):
self.menus = UiMenus(self,controller)
self.ToolBars = UiToolBars(self,controller)
self.statusBar = UiStatusBar(self)
self.content = UiContent(self,data)
self.Show(true)
class SizersDemo(wxApp):
def OnInit(self):
self.data = None
self.controller=Tools(self.data)
self.ui = Ui(None, -1, "SizersDemo")
self.controller.setUi(self.ui)
self.ui.start(self.data, self.controller)
self.SetTopWindow(self.ui)
return true
if __name__ == "__main__":
sizersDemo = SizersDemo(0)
sizersDemo.MainLoop()