from wxPython.wx import *

class MyFrame(wxFrame):
    def __init__(
		self, parent, id, title,
        pos = wxPyDefaultPosition, size = wxPyDefaultSize,
        style = wxDEFAULT_FRAME_STYLE
	):
        wxFrame.__init__(self, parent, id, title, pos, size, style)

        self.panel = wxPanel(self, -1, style = wxADJUST_MINSIZE)        
        
        label1 = wxStaticText( self.panel, -1, "label1:" )
        self.mut1 = wxStaticText( self.panel, -1, "mutable text 1" )
        label2 = wxStaticText( self.panel, -1, "label2:")
        mut2 = wxStaticText( self.panel, -1,
                             "here's another mutable text string")
        btn = wxButton( self.panel, -1, "Add Text to Mut1", )

        # lay everything out:
        grid = wxFlexGridSizer( 0, 2, 0, 0 )
        grid.AddWindow( label1, 0,
                        wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 )

        self.panel.labelSizer = wxBoxSizer( wxHORIZONTAL )
        self.panel.labelSizer.AddWindow( self.mut1, 0,
                        wxALIGN_CENTER_VERTICAL|wxALL|wxADJUST_MINSIZE, 5 )
        grid.AddSizer(self.panel.labelSizer, 0, 0)
        
        grid.AddWindow( label2, 0,
                        wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL|wxADJUST_MINSIZE, 5 )
        grid.AddWindow( mut2, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxADJUST_MINSIZE, 5 )
        
        panelSizer = wxBoxSizer( wxVERTICAL )
        panelSizer.AddSizer( grid, 0, wxALIGN_CENTRE|wxALL|wxADJUST_MINSIZE, 5 )
        panelSizer.AddWindow( btn, 0, wxALIGN_CENTRE|wxALL|wxADJUST_MINSIZE, 5 )

        self.panel.SetAutoLayout( true )
        self.panel.SetSizer( panelSizer )
        
        panelSizer.Fit( self.panel )
        panelSizer.SetSizeHints( self.panel )

##        frameSizer = wxBoxSizer( wxVERTICAL )
##        frameSizer.AddWindow(self.panel, 1, wxEXPAND)
##        self.SetAutoLayout( true )
##        self.SetSizer( frameSizer )
##        frameSizer.Fit( self )
##        frameSizer.SetSizeHints( self )

        self.SetClientSize(self.panel.GetSize())
        
        EVT_BUTTON(self, btn.GetId(), self.OnAddText)

    def OnAddText(self, event):
        label = self.mut1.GetLabel()
        n = label.count('\n') + 2
        self.mut1.SetLabel(self.mut1.GetLabel() + '\nadded line %d' % n)
##        self.panel.labelSizer.Fit(self.mut1)
##        self.panel.labelSizer.SetSizeHints( self.mut1 )
        self.panel.Fit()
        self.panel.Layout()
        self.SetClientSize(self.panel.GetSize())
##        self.panel.GetSizer().Fit( self.panel )
##        self.SetClientSize(self.panel.GetSize())
        print 'text displayed should be:'
        print self.mut1.GetLabel()

    
if __name__ == "__main__":
    app = wxPySimpleApp()
    frame = MyFrame(None, -1, "test frame", size=(300,200))
    frame.Show(true)
    app.MainLoop()
