2017-02-21 18 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. Есть ли способ удалить пустые пространства * независимо * от типа sizer (сетка sizer, flex grid sizer, bag sizer и т. Д.)? – Kade

+0

Насколько я знаю, 'GridSizer' довольно статичен. Вам нужно будет прочитать последнюю кнопку для sizer во второй позиции. –

+0

Как насчет 'FlexGridSizer'? – Kade