Jed V
Jed V

Reputation: 31

wxPython unintentional window resizing when hiding/showing panels on Windows

I have a wx 2.8 (Python 2.7) basic GUI that switches panels when the next button is pressed. When the GUI is opened, it is maximized. For some reason though, on Windows 7/10, the whole window resizes to the minimum size but on Ubuntu 14.04, it doesn't. Can someone please tell me what I'm doing wrong here? I don't want the window to resize, I want it to stay Maximized. The whole code is below:

#!/usr/bin/env python

import wx

class MainWindow(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Test")

        self.SetMinSize((1000, 700))
        self.Maximize(True)

        self.panel_one = Panel_One(self)
        self.panel_two = Panel_Two(self)
        self.panel_three = Panel_Three(self)

        self.panel_two.Hide()
        self.panel_three.Hide()

        self.PanelSizer = wx.BoxSizer(wx.VERTICAL)
        self.PanelSizer.Add(self.panel_one,   1, wx.CENTER|wx.EXPAND|wx.ALL)
        self.PanelSizer.Add(self.panel_two,   1, wx.CENTER|wx.EXPAND|wx.ALL)
        self.PanelSizer.Add(self.panel_three, 1, wx.CENTER|wx.EXPAND|wx.ALL)
        self.SetSizer(self.PanelSizer)

        self.Center()

    def ShowPanelTwo(self, event):
        self.panel_one.Hide()
        self.panel_two.Show()
        self.panel_two.TopSizer.Fit(self)

    def ShowPanelThree(self, event):
        self.panel_two.Hide()
        self.panel_three.Show()
        self.panel_three.TopSizer.Fit(self)

class Panel_One(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.parent = parent

        self.list = wx.ListCtrl(self, wx.ID_ANY, style = wx.LC_REPORT | wx.BORDER_SUNKEN)
        self.list.InsertColumn(0, 'List 1')
        self.nextbutton = wx.Button(self, wx.ID_ANY, label="Next", size=(80,-1))
        self.nextbutton.Bind(wx.EVT_BUTTON, self.parent.ShowPanelTwo)
        self.VSizer = wx.BoxSizer(wx.VERTICAL)
        self.HSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.TopSizer = wx.BoxSizer(wx.VERTICAL)

        self.VSizer.Add(self.list, 1, wx.ALIGN_CENTER|wx.EXPAND, 5)
        self.HSizer.Add(self.VSizer, 1, wx.ALIGN_CENTER|wx.EXPAND, 5)
        self.TopSizer.Add(self.HSizer, 1, wx.ALIGN_CENTER|wx.EXPAND, 5)
        self.TopSizer.Add(self.nextbutton, 0, wx.EXPAND, 5)
        self.SetSizer(self.TopSizer)

class Panel_Two(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.parent = parent

        self.list = wx.ListCtrl(self, wx.ID_ANY, style = wx.LC_REPORT | wx.BORDER_SUNKEN)
        self.list.InsertColumn(0, 'List 2')
        self.nextbutton = wx.Button(self, wx.ID_ANY, label="Next", size=(80,-1))
        self.nextbutton.Bind(wx.EVT_BUTTON, self.parent.ShowPanelThree)
        self.VSizer = wx.BoxSizer(wx.VERTICAL)
        self.HSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.TopSizer = wx.BoxSizer(wx.VERTICAL)

        self.VSizer.Add(self.list, 1, wx.ALIGN_CENTER|wx.EXPAND, 5)
        self.HSizer.Add(self.VSizer, 1, wx.ALIGN_CENTER|wx.EXPAND, 5)
        self.TopSizer.Add(self.HSizer, 1, wx.ALIGN_CENTER|wx.EXPAND, 5)
        self.TopSizer.Add(self.nextbutton, 0, wx.EXPAND, 5)
        self.SetSizer(self.TopSizer)

class Panel_Three(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.parent = parent

        self.list = wx.ListCtrl(self, wx.ID_ANY, style = wx.LC_REPORT | wx.BORDER_SUNKEN)
        self.list.InsertColumn(0, 'List 3')
        self.VSizer = wx.BoxSizer(wx.VERTICAL)
        self.HSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.TopSizer = wx.BoxSizer(wx.VERTICAL)

        self.VSizer.Add(self.list, 1, wx.ALIGN_CENTER|wx.EXPAND, 5)
        self.HSizer.Add(self.VSizer, 1, wx.ALIGN_CENTER|wx.EXPAND, 5)
        self.TopSizer.Add(self.HSizer, 1, wx.ALIGN_CENTER|wx.EXPAND, 5)
        self.SetSizer(self.TopSizer)

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

Upvotes: 0

Views: 97

Answers (1)

RobinDunn
RobinDunn

Reputation: 6206

Try replacing the self.whatever.TopSizer.Fit(self) lines with just self.Layout(). You don't want to change the size of anything, which Fit does, you just want the contents of the panels to be laid out according to the sizer's layout algorithm.

Upvotes: 1

Related Questions