让WxPython面板项扩展

4 投票
1 回答
7210 浏览
提问于 2025-04-16 00:20

我有一个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”属性,算是一个小福利。你可以选择使用它,也可以不使用。

撰写回答