【问题标题】:wxPython — StaticBox Sizer resizing Static BoxeswxPython — StaticBox Sizer 调整静态框的大小
【发布时间】:2015-03-10 12:21:12
【问题描述】:

这是我应该自行运行的代码的最小示例——按原样运行,一切都按我想要的方式布置,3 行节点均匀分布:

import wx

def createBoxes():
    outVSizer = wx.BoxSizer(wx.VERTICAL)
    outHSizer = wx.BoxSizer(wx.HORIZONTAL)
    outVSizer.AddStretchSpacer(1)
    outHSizer.AddStretchSpacer(1)
    sizer = wx.FlexGridSizer(rows=3, cols=3, vgap=35, hgap=20)

    box = {}
    boxSizer = {}
    text = wx.StaticText(panel, wx.ID_ANY, "This is a test")
    for i in range(6):
        box[i] = wx.StaticBox(panel, wx.ID_ANY, "testBox", size=(0,100))
        #boxSizer[i] = wx.StaticBoxSizer(box[i], wx.VERTICAL)
        #boxSizer[i].Add(text, proportion = 1, flag=wx.ALIGN_CENTER)
        sizer.Add(box[i], flag=wx.EXPAND)
    sizer.AddGrowableCol(0,1)
    sizer.AddGrowableCol(1,1)
    sizer.AddGrowableCol(2,1)

    outHSizer.Add(sizer, flag=wx.EXPAND, proportion=15)
    outHSizer.AddStretchSpacer(1)
    outVSizer.Add(outHSizer, flag=wx.EXPAND, proportion=15)
    panel.SetSizer(outVSizer)

app = wx.App()
frame = wx.Frame(None, size=(500,500))
panel = wx.Panel(frame)
createBoxes()
frame.Show()
app.MainLoop()

但是,当我取消注释两行注释并将其后的行更改为:

sizer.Add(boxSizer[i], flag=wx.EXPAND)

布局变得局促,节点垂直重叠等。我不知道我在这里做错了什么,有人有建议吗?

【问题讨论】:

    标签: python user-interface wxpython


    【解决方案1】:

    将文本小部件添加到 6 个不同的尺寸器绝不是一个好主意。我建议为每个 sizer 创建一个 StaticText 的新实例。重叠的原因是你在使用StaticBoxsizers时需要增加你的vgap

    这是代码的更新版本:

    import wx
    
    def createBoxes():
        outVSizer = wx.BoxSizer(wx.VERTICAL)
        outHSizer = wx.BoxSizer(wx.HORIZONTAL)
        outVSizer.AddStretchSpacer(1)
        outHSizer.AddStretchSpacer(1)
        sizer = wx.FlexGridSizer(rows=3, cols=3, vgap=55, hgap=20)
    
        box = {}
        boxSizer = {}
        #text = wx.StaticText(panel, wx.ID_ANY, "This is a test")
        for i in range(6):
            box[i] = wx.StaticBox(panel, wx.ID_ANY, "testBox", size=(0,100))
            text = wx.StaticText(panel, wx.ID_ANY, "This is a test")
            boxSizer[i] = wx.StaticBoxSizer(box[i], wx.VERTICAL)
            boxSizer[i].Add(text, proportion = 1, flag=wx.ALIGN_CENTER)
            sizer.Add(boxSizer[i], flag=wx.EXPAND)
        sizer.AddGrowableCol(0,1)
        sizer.AddGrowableCol(1,1)
        sizer.AddGrowableCol(2,1)
    
        outHSizer.Add(sizer, flag=wx.EXPAND, proportion=15)
        outHSizer.AddStretchSpacer(1)
        outVSizer.Add(outHSizer, flag=wx.EXPAND, proportion=15)
        panel.SetSizer(outVSizer)
    
    app = wx.App()
    frame = wx.Frame(None, size=(500,500))
    panel = wx.Panel(frame)
    createBoxes()
    frame.Show()
    app.MainLoop()
    

    【讨论】:

    • plus+1,双柱,任何人 grin
    • 就是这样。看起来很简单,但我没想过要增加 vgap,因为它在 staticboxsizer 进入之前就在使用那个 vgap。我认为它只会将 vgap 的开头向下移动以匹配静态框的底部。就像它切换到 staticboxsizer 的末尾一样,它被收缩包装到静态框中的文本 - 呃。谢谢!
    【解决方案2】:

    这将是获得某些结果所需的最少更改:

        # text = wx.StaticText(panel, wx.ID_ANY, "This is a test")
        for i in range(6):
            box[i] = wx.StaticBox(panel, wx.ID_ANY, "testBox", size=(0,100))
            # change I
            text = wx.StaticText(panel, wx.ID_ANY, "This is a test")
            boxSizer[i] = wx.StaticBoxSizer(box[i], wx.VERTICAL)
            boxSizer[i].Add(text, proportion = 1, flag=wx.ALIGN_CENTER)
            # sizer.Add(box[i], flag=wx.EXPAND)
            # change II
            sizer.Add(boxSizer[i], flag=wx.EXPAND)
    

    您已将text 添加到六个不同的尺寸器(这不是一个好主意)。其次,您必须将 StaticBoxSizernot 静态框添加到父 sizer。

    下一个问题是sizer 设置了flag=wxEXPAND,但没有比例。因此它永远不会改变大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-08
      • 2012-11-22
      • 1970-01-01
      • 2015-02-27
      • 2018-03-03
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多