Windows hiding/showing 面板时 wxPython 无意 window 调整大小

wxPython unintentional window resizing when hiding/showing panels on Windows

我有一个 wx 2.8 (Python 2.7) 基本 GUI,可以在按下下一个按钮时切换面板。打开 GUI 时,它会最大化。但是出于某种原因,在 Windows 7 月 10 日,整个 window 调整为最小大小,但在 Ubuntu 14.04 上,它没有。有人可以告诉我我在这里做错了什么吗?我不希望 window 调整大小,我希望它保持最大化。完整代码如下:

#!/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()

尝试将 self.whatever.TopSizer.Fit(self) 行替换为 self.Layout()。您不想更改任何内容的大小,而 Fit 会这样做,您只想根据 sizer 的布局算法对面板的内容进行布局。