让WxPython面板项扩展
我有一个WxPython的窗口,里面放了一个东西,比如:
class Panel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.text = wx.StaticText(self, label='Panel 1')
这个窗口里有几个面板,包括我提到的这个,面板的大小是由布局管理器控制的。我希望这个StaticText
能够自动扩展。使用一个只包含文本的BoxSizer
并设置wx.EXPAND
标志可以实现这个效果,但单独为一个项目使用布局管理器感觉有点多余。
有没有更简单的办法呢?
(我可以直接把StaticText
放到父窗口的布局管理器里,但为了我的设计,直接从一个窗口开始更合理。)
我刚意识到,创建一个只包含一个项目的BoxSizer
在使用wx.VERTICAL
时并不好用:
class Panel1(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.BackgroundColour = 'red'
sizer = wx.BoxSizer(wx.VERTICAL)
self.Sizer = sizer
self.list = wx.ListBox(self, choices=[str(i) for i in xrange(100)])
sizer.Add(self.list, 0, wx.EXPAND)
sizer.Fit(self)
当然,一个项目是可以的,但如果我想以后再垂直添加一个项目,并且希望这两个项目都能扩展(比如当用户扩大窗口时)呢?
编辑:哦,我刚发现要让布局管理器在两个方向上都能扩展,必须使用比例。(也就是说,在BoxSizer.Add
的调用中把0换成1。)
1 个回答
8
如果一个 wx.Frame
只有一个子控件,它会自动处理一些布局的事情。但是,wx.Panel
就不会自动这样做了。你需要使用一个叫做“sizer”的东西来帮忙布局。如果你发现自己经常需要这样做,可以考虑写一个方便的函数来简化这个过程:
def expanded(widget, padding=0):
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(widget, 1, wx.EXPAND|wx.ALL, padding)
return sizer
class Panel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.text = wx.StaticText(self, label='Panel 1')
self.SetSizer(expanded(self.text))
我在这里加了一个额外的“padding”属性,算是一个小福利。你可以选择使用它,也可以不使用。