With these it helps It would be much easier to create a new panel class with all those controls parented to it, and then just add and delete instances of the panel. The panel instances could be stored in a list.
help you fix your problem When you create a wx.StaticBoxSizer, you must pass it a wx.StaticBox as the first argument of the initializer, this is what you need to modify to change the label. If you look at the class hierarchies, they go as follows: object -> Object -> EvtHandler -> Window -> Control -> StaticBox object -> Object -> Sizer -> BoxSizer -> StaticBoxSizer
# creating the static box sizer
self.my_box = wx.StaticBox(self.panel, wx.ID_ANY, "Spam, spam, spam")
self.sizer_static_box = wx.StaticBoxSizer(self.my_box)
# then do something like this later
self.my_box.SetLabel("I hate spam!")
How to debug wxpython app that crashes deep in wxpython/python threading
this will help Make sure you're not calling a wx method directly from a thread. If you do, then you are doing something that's undefined and will cause issues. You have to use a wx thread safe method instead, such as wx.CallAfter, wx.CallLater or wx.PostEvent. If you call something like myControlSetValue() from within a thread, you'll have problems. I recommend asking over on the wxPython mailing list as well. There are several Mac guys there including a couple of core devs.
Can't go back to wxpython main frame after creating and destroying Dialogue using ShowModal via Pubsub
this will help The modal dialog reenables everything by the time ShowModal() returns, so just call OnFinish() directly from OnButton(). However notice that wxProgressDialog is not a modal dialog at all (it would be pretty useless if it were as you wouldn't be able to call Update() on it!), so in its case you should just destroy it when you are done with it (or use wxPD_AUTO_HIDE style to tell it to go away on its own when maximal progress value is reached).