java
java

Reputation: 1214

wxpython sizers expands issue

I have a screen which has 6 grids as follows:

enter image description here

I'm adding a 7th grid. This causes the screen to look like:

enter image description here

however I want the screen to be:

enter image description here

I tried to do it with flexgrid but it's not working.

This is my code:

sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
sizer_2.AddSpacer(10)

sizer_4 = wx.BoxSizer(wx.VERTICAL)
sizer_4.Add(self.grid1, 1, wx.EXPAND, 0)
sizer_4.AddSpacer(20)
sizer_4.Add(self.grid4, 1, wx.EXPAND, 0)
sizer_4.AddSpacer(20)
sizer_4.Add(self.grid7, 1, wx.EXPAND, 0)  


sizer_5 = wx.BoxSizer(wx.VERTICAL)
sizer_5.Add(self.grid2, 1, wx.EXPAND, 0)
sizer_5.AddSpacer(20)
sizer_5.Add(self.grid5, 1, wx.EXPAND, 0)

sizer_6 = wx.BoxSizer(wx.VERTICAL)
sizer_6.Add(self.grid3, 1, wx.EXPAND, 0)
sizer_6.AddSpacer(20)
sizer_6.Add(self.grid6, 1, wx.EXPAND, 0)      


sizer_3=wx.BoxSizer(wx.HORIZONTAL)
sizer_3.AddSpacer(20)
sizer_3.Add(sizer_4, 1, wx.EXPAND, 0)
sizer_3.AddSpacer(20)
sizer_3.Add(sizer_5, 1, wx.EXPAND, 0)
sizer_3.AddSpacer(20)
sizer_3.Add(sizer_6, 1, wx.EXPAND, 0)


sizer_1= wx.BoxSizer(wx.VERTICAL)
sizer_1.AddSpacer(10)
sizer_1.Add(sizer_2)
sizer_1.AddSpacer(20)
sizer_1.Add(sizer_3, 1, wx.EXPAND, 0)

self.SetSizer(sizer_1)
self.Layout()

What can I do?

Upvotes: 0

Views: 41

Answers (1)

Mike Driscoll
Mike Driscoll

Reputation: 33111

I don't like the grid sizers because I find them pretty confusing. So I typically take something like this and draw boxes around the various groups. The boxes represent BoxSizers. Once I have that done, I know what to do and write my code accordingly. Here's how I would lay this out:

import wx

########################################################################
class GenericPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent, color):
        """Constructor"""
        wx.Panel.__init__(self, parent, size=(200, 100))
        self.SetBackgroundColour(color)


########################################################################
class MainPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        left_sizer = wx.BoxSizer(wx.VERTICAL)
        for i in range(3):
            panel = GenericPanel(self, 'red')
            left_sizer.Add(panel, 0, wx.ALL, 5)

        top_right_sizer = wx.BoxSizer(wx.HORIZONTAL)
        for i in range(2):
            panel = GenericPanel(self, 'green')
            top_right_sizer.Add(panel, 0, wx.ALL, 5)

        bottom_right_sizer = wx.BoxSizer(wx.HORIZONTAL)
        for i in range(2):
            panel = GenericPanel(self, 'blue')
            bottom_right_sizer.Add(panel, 0, wx.ALL, 5)

        stack_sizer = wx.BoxSizer(wx.VERTICAL)
        stack_sizer.Add(top_right_sizer)
        stack_sizer.Add(bottom_right_sizer)

        main_sizer = wx.BoxSizer(wx.HORIZONTAL)
        main_sizer.Add(left_sizer)
        main_sizer.Add(stack_sizer)
        main_sizer.AddStretchSpacer(prop=1)
        self.SetSizer(main_sizer)


########################################################################
class MainFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title='Boxes', size=(700,400))
        panel = MainPanel(self)
        self.Show()

if __name__ == '__main__':
    app = wx.App(False)
    frame = MainFrame()
    app.MainLoop()

Upvotes: 1

Related Questions