wxPython: Fit() works on wxPanel, but not on surrounding wxFrame

Discussion in 'Python' started by Piet, May 20, 2004.

  1. Piet

    Piet Guest

    Hello,
    I am still struggling with a dynamic dialog box.
    I have created a dialog box that will show a variable number of
    controls depending on a selection made in a ComboBox also present in
    the frame. The dialog box is not derived from wxDialog, but from a
    wxFrame.
    The dialog is initialized as follows:

    class myDialog(wxFrame):
    def __init__(self,parent,title):
    wxFrame.__init__(self,parent,-1, title,
    style=wxDEFAULT_FRAME_STYLE)
    self.panel = wxPanel(self,-1)
    The position of the controls on the wxPanel inside the frame is
    controlled by sizers, which are initialized as follows:
    self.MasterSizer=wxBoxSizer(wxVERTICAL)
    self.panel.SetSizer(self.MasterSizer)
    self.panel.SetAutoLayout(True)
    self.MasterSizer.Fit(self.panel)
    self.panel.Fit()
    self.Fit()

    To ensure that the size of the window and its layout always take into
    account the number of the controls, every function that will change
    the number of controls ends with the following threelines:
    self.MasterSizer.RecalcSizes()
    self.panel.Fit()
    self.Fit()

    For some reason, only the wxPanel changes its size as expected and
    fits nicely around the controls placed on it. The surrounding wxFrame
    is always (except at initialization time) slightly larger than the
    panel, resulting in an ugly, dark grey border on the right and at the
    bottom of the frame. How is that possible?
    Thanks in advance for your help
    Piet
     
    Piet, May 20, 2004
    #1
    1. Advertisements

  2. Piet

    simo Guest

    (Piet) wrote:

    [snip]
    I don't think Fit() is needed, it's implied by:

    self.MasterSizer.SetSizeHints(self)

    But you've not used that. You've also not added the panel to the
    sizer:

    self.MasterSizer.Add(self.panel, 1, wx.ALL|wx.EXPAND, 0)

    Also, I think you need a self.Layout() at the end of those three
    lines.

    Finally, beware of scrollbars, they're not at all well handled by wx's
    sizers.

    To get past the initial layout differing from the resized layout, I
    usually would call your EVT_SIZE handler to do the initial layout too,
    then you can just fix one function....

    It's a bit hard to debug with only a snippet of code.
     
    simo, May 20, 2004
    #2
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.