2017-02-21 14 views
0

ウィジェットをウィジェット内に非表示にし、空白を残したくありません。 ウィジェットを後で再度表示したいので、ウィジェットを削除したくありません。wxPython:ウィジェットを非表示にして残りのスペースを削除する

ウィジェットを非表示にし、空白を埋めるために1つのスペースを移動した後にウィジェットを表示する方法はありますか?ここで

は残されているスペースの簡単な例です:

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を使用したことがありますか?この方法を試してください。

FlexGridSizerを使用して
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() 

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

あなたの例の空のスペースを削除しないが、私の知る限り、これが唯一のバッグサイザーのために動作します。 サイザータイプ(グリッドサイザー、フレックスグリッドサイザー、バッグサイザーなど)に関係なく*空のスペースを削除する方法はありますか? – Kade

+0

私が知る限り、 'GridSizer'はかなり静的です。その最後のボタンを2番目の位置のsizerに読み込む必要があります。 –

+0

'FlexGridSizer'はどうですか? – Kade

関連する問題