import wx


'''

Title: How to resize the wxpython panel?

I created a simple test case to resize a panel.
The layout contains a main frame and 3 panels
The frame contains a vertical boxsizer that contains 2 components
The first component is a horizontal boxsizer
The second component is a panel containing the "Close" button

The horizontal boxsizer contains 2 panels
I arbitrarily create the 2 panels having widths of ratio 1:2

When the program runs, I want the width of the right panel to be equal to the height of the right panel
and the rest of the remaining width space to be the width of the left panel.
I implemented this using CallAfter() for the Maximize event

The program runs. No changes are made to any of the 2 panels.
If I omit the Layout() method, I see that the size of the right panel changes, but the layout does not occur.
Can someone example how this is supposed to work?

Thanks
'''

'''
Python 3.10.6 on linux, wxPython 4.0.7 gtk3 (phoenix) wxWidgets 3.0.5
'''

class MainFrame(wx.Frame):
  def __init__(self):
    wx.Frame.__init__(self, parent=None, title='Resize Panels', style= wx.CAPTION | wx.CLOSE_BOX)
    self.leftbuttonpanel = LeftButtonPanel(self)
    self.rightbuttonpanel = RightButtonPanel(self)
    self.actionbuttonpanel = ActionButtonPanel(self)
    self.h_framesizer = wx.BoxSizer(wx.HORIZONTAL)
    self.h_framesizer.Add(self.leftbuttonpanel, 1, flag=wx.EXPAND)
    self.h_framesizer.Add(self.rightbuttonpanel, 2, flag=wx.EXPAND)
    self.v_framesizer = wx.BoxSizer(wx.VERTICAL)
    self.v_framesizer.Add(self.h_framesizer, 1, flag=wx.EXPAND)
    self.v_framesizer.Add(self.actionbuttonpanel, 0, flag=wx.EXPAND)
    self.SetSizer(self.v_framesizer)
    self.Bind(wx.EVT_MAXIMIZE, self.OnMaximize)
    self.Maximize()
    self.Show(True)


  def OnMaximize(self, event):
    self.Update()
    wx.CallAfter(self.ResizePanels)


  def ResizePanels(self):
    self.GetPanelSizes()
    self.rightbuttonpanel.SetSize(self.right_panel_size[1], self.right_panel_size[1])
    self.Layout()


  def GetPanelSizes(self):
    dc1 = wx.ClientDC(self.leftbuttonpanel)
    self.left_panel_size = dc1.GetSize()
    dc2 = wx.ClientDC(self.rightbuttonpanel)
    self.right_panel_size = dc2.GetSize()
    dc3 = wx.ClientDC(self.actionbuttonpanel)
    self.action_panel_size = dc3.GetSize()

    print(self.left_panel_size)
    print(self.right_panel_size)
    print(self.action_panel_size) 


  def OnClose(self):
    self.Close()

    
class LeftButtonPanel(wx.Panel):
  def __init__(self, parent):
    wx.Panel.__init__(self, parent=parent)
    self.SetBackgroundColour('GREEN')
    self.parent = parent
    self.leftbutton = wx.Button(self, label = 'Left')
    self.h_leftbuttonpanelsizer = wx.BoxSizer(wx.HORIZONTAL)
    self.h_leftbuttonpanelsizer.AddStretchSpacer(prop=1)
    self.h_leftbuttonpanelsizer.Add(self.leftbutton, 0, wx.ALIGN_CENTER)
    self.v_leftbuttonpanelsizer = wx.BoxSizer(wx.VERTICAL)
    self.v_leftbuttonpanelsizer.AddStretchSpacer(prop=1)
    self.v_leftbuttonpanelsizer.Add(self.h_leftbuttonpanelsizer, 0, flag=wx.EXPAND)
    self.v_leftbuttonpanelsizer.AddStretchSpacer(prop=1)
    self.SetSizer(self.v_leftbuttonpanelsizer)
    self.Bind(wx.EVT_BUTTON, self.OnLeft, self.leftbutton)


  def OnLeft(self, event):
    return


class RightButtonPanel(wx.Panel):
  def __init__(self, parent):
    wx.Panel.__init__(self, parent=parent)
    self.SetBackgroundColour('BLUE')
    self.parent = parent
    self.rightbutton = wx.Button(self, label = 'Right')
    self.h_rightbuttonpanelsizer = wx.BoxSizer(wx.HORIZONTAL)
    self.h_rightbuttonpanelsizer.Add(self.rightbutton, 0, wx.ALIGN_CENTER)
    self.h_rightbuttonpanelsizer.AddStretchSpacer(prop=1)
    self.v_rightbuttonpanelsizer = wx.BoxSizer(wx.VERTICAL)
    self.v_rightbuttonpanelsizer.AddStretchSpacer(prop=1)
    self.v_rightbuttonpanelsizer.Add(self.h_rightbuttonpanelsizer, 0, flag=wx.EXPAND)
    self.v_rightbuttonpanelsizer.AddStretchSpacer(prop=1)
    self.SetSizer(self.v_rightbuttonpanelsizer)
    self.Bind(wx.EVT_BUTTON, self.OnRight, self.rightbutton)


  def OnRight(self, event):
    return


class ActionButtonPanel(wx.Panel):
  def __init__(self, parent):
    wx.Panel.__init__(self, parent=parent)
    self.parent = parent
    self.buttonpanelsizer = wx.BoxSizer(wx.HORIZONTAL)
    self.closebutton = wx.Button(self, label = 'Close')
    self.Bind(wx.EVT_BUTTON, self.OnClose, self.closebutton)
    self.buttonpanelsizer.AddStretchSpacer(prop=1)
    self.buttonpanelsizer.Add(self.closebutton, 0, wx.ALIGN_CENTER)
    self.buttonpanelsizer.AddSpacer(20)
    self.SetSizer(self.buttonpanelsizer)


  def OnClose(self, event):
    self.parent.OnClose()


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