2017-02-21 111 views
0

我想在一个sizer中隐藏一个小部件而不留空的空间。 我不想删除小部件,因为我想稍后再显示它。wxPython:隐藏一个小部件并删除剩余空间

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

这里被留下了空间的一个简单的例子:

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

你有使用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() 
+0

你的例子并取出空的空间,但就我所看到的,这只是一个袋子仪工作。 是否有一种方法可以删除空白空格*,而不管* sizer类型(grid sizer,flex grid sizer,bag sizer等)? – Kade

+0

据我所知,'GridSizer'非常静态。您需要在第二个位置将最后一个按钮读取给sizer。 –

+0

“FlexGridSizer”呢? – Kade