wxPython:隐藏窗口小部件并删除剩余空间

时间:2017-02-21 15:05:15

标签: python wxpython hide sizer

我想在sizer中隐藏一个小部件,而不是留空空间。 我不想删除小部件,因为我想稍后再次显示它。

有没有办法隐藏窗口小部件,并在移动到一个空格以填充空白点后显示小部件?

这是一个留下空间的简单例子:

import wx

class MyPanel(wx.Panel):
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        sizer = wx.GridSizer(1, 3, 0, 0)

        a = wx.Button(self, -1, 'a')
        b = wx.Button(self, -1, 'b')
        c = wx.Button(self, -1, 'c')

        sizer.Add(a, 0, 0, 0)
        sizer.Add(b, 0, 0, 0)
        sizer.Add(c, 0, 0, 0)

        b.Hide()

        self.SetSizer(sizer)

class MyFrame(wx.Frame):
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, parent=None, title="Remove Spaces")
        panel = MyPanel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(panel, 1, wx.EXPAND)
        self.SetSizer(sizer)
        self.Fit()
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

1 个答案:

答案 0 :(得分:1)

你必须使用wx.GridSizer吗?因为它会为您提供固定布局,所以即使您隐藏控件,网格仍会显示该空格。

您是否考虑过使用wx.GridBagSizer?试试这个:

class MyPanel(wx.Panel):
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)
        self.parent = parent

        self.sizer = wx.GridBagSizer()

        self.a = wx.Button(self, -1, 'a')
        self.b = wx.Button(self, -1, 'b')
        self.c = wx.Button(self, -1, 'c')
        self.a.Bind(wx.EVT_BUTTON, self.button_clicked)

        self.sizer.Add(self.a, pos=(0, 0))
        self.sizer.Add(self.b, pos=(0, 1))
        self.sizer.Add(self.c, pos=(0, 2))

        self.SetSizer(self.sizer)

    def button_clicked(self, event):
        if self.b.IsShown():
            self.b.Hide()
        else:
            self.b.Show()
        self.parent.Fit()

使用FlexGridSizer

class MyPanel(wx.Panel):
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)
        self.parent = parent

        self.sizer = wx.FlexGridSizer(1, 3, 0, 0)

        self.a = wx.Button(self, -1, 'a')
        self.b = wx.Button(self, -1, 'b')
        self.c = wx.Button(self, -1, 'c')
        self.a.Bind(wx.EVT_BUTTON, self.button_clicked)

        self.sizer.Add(self.a)
        self.sizer.Add(self.b)
        self.sizer.Add(self.c)

        self.SetSizer(self.sizer)

    def button_clicked(self, event):
        if self.b.IsShown():
            self.b.Hide()
        else:
            self.b.Show()
        self.parent.Fit()