wxPython:隐藏一个小部件并删除剩余的 space
wxPython: Hide a widget and remove the leftover space
我想在 sizer 中隐藏一个小部件而不是留空 space。
我不想删除小部件,因为我想稍后再显示它。
有没有办法隐藏一个小部件,并在它移过一个 space 以填补空白后显示小部件?
这是一个 space 被留下的简单例子:
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()
你必须使用wx.GridSizer
吗?因为它会给你一个 固定布局 ,所以即使你隐藏了一个控件,网格仍然会显示 space。
您是否考虑过使用 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()
我想在 sizer 中隐藏一个小部件而不是留空 space。 我不想删除小部件,因为我想稍后再显示它。
有没有办法隐藏一个小部件,并在它移过一个 space 以填补空白后显示小部件?
这是一个 space 被留下的简单例子:
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()
你必须使用wx.GridSizer
吗?因为它会给你一个 固定布局 ,所以即使你隐藏了一个控件,网格仍然会显示 space。
您是否考虑过使用 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()