wxPython: BoxSizer中的项目只垂直扩展,不水平扩展

10 投票
1 回答
9464 浏览
提问于 2025-04-15 13:37

我有几个按钮放在不同的布局里,它们的扩展方式正是我想要的。不过,当我把父容器放到一个新的 wx.BoxSizer 里,这个新的布局是用来给框架里的所有元素加边框的,结果这个布局在垂直方向上工作正常,但在水平方向上却不行。

下面的代码展示了这个问题:

#! /usr/bin/env python

import wx
import webbrowser

class App(wx.App):


    def OnInit(self):
       frame = MainFrame()
       frame.Show()
       self.SetTopWindow(frame)
       return True


class MainFrame(wx.Frame):

    title = 'Title'


    def __init__(self):
        wx.Frame.__init__(self, None, -1, self.title)

        panel = wx.Panel(self)

        #icon = wx.Icon('icon.png', wx.BITMAP_TYPE_PNG)
        #self.SetIcon(icon)

        sizer = wx.FlexGridSizer(rows=2, cols=1, vgap=10, hgap=10)

        button1 = wx.Button(panel, -1, 'BUTTON')
        sizer.Add(button1, 0, wx.EXPAND)

        buttonSizer = wx.FlexGridSizer(rows=1, cols=4, vgap=10, hgap=5)

        buttonDelete = wx.Button(panel, -1, 'Delete')
        buttonSizer.Add(buttonDelete, 0, 0)

        buttonEdit = wx.Button(panel, -1, 'Edit')
        buttonSizer.Add(buttonEdit, 0, 0)

        buttonNew = wx.Button(panel, -1, 'New')
        buttonSizer.Add(buttonNew, 0, 0)

        buttonSizer.AddGrowableCol(0, 0)

        sizer.Add(buttonSizer, 0, wx.EXPAND|wx.HORIZONTAL)

        sizer.AddGrowableCol(0, 0)
        sizer.AddGrowableRow(0, 0)

        mainSizer = wx.BoxSizer(wx.EXPAND)
        mainSizer.Add(sizer, 0, wx.EXPAND|wx.ALL, 10)

        #panel.SetSizerAndFit(sizer)
        #sizer.SetSizeHints(self)
        panel.SetSizerAndFit(mainSizer)
        mainSizer.SetSizeHints(self)


if __name__ == '__main__':
    app = App(False)
    app.MainLoop()

如果把5758行注释掉,然后把5556行取消注释,就能去掉多余的 BoxSizer,这样一切就会按照我预期的方式工作(当然没有多余的空白)。

我对这个问题完全无从下手,还是不知道该怎么解决。

1 个回答

27

首先,你传递的一些标志用错了。BoxSizer 只接受 wxHORIZONTAL 或 wxVERTICAL,而不是 wxEXPAND。sizer.Add 也不接受 wxHORIZONTAL。

如果你有一个垂直的 BoxSizer,wxEXPAND 会让控件横向填满,而第二个参数(Add 的第二个参数)如果是 1 或更多,就会让控件纵向填满。对于水平的 BoxSizer 则正好相反。

sizer = wx.BoxSizer(wxVERTICAL)
sizer.Add(widget1, 0, wxEXPAND)
sizer.Add(widget2, 1)

widget1 会横向扩展,而 widget2 会纵向扩展。

如果你把一个 sizer 放在另一个 sizer 里,你需要确保设置好它的比例和 EXPAND 标志,这样它内部的内容才能按照你想要的方式扩展。

剩下的就留给你自己去处理了。

撰写回答