wxPython:GridBagSizer:迭代gridbagsizer的行和列

时间:2015-04-13 17:57:03

标签: wxpython wxwidgets

有没有办法按行/列顺序遍历wx.GridBagSizer的Children?

我注意到我可以在sizer上执行GetChildren()但我找不到API中的文档,这些文档说明了这些子项实际映射到行或列的方式。 有两种方法:

GetEffectiveRowsCount()
GetEffectiveColsCount()

但我不知道如何使用这些来迭代孩子们。 我在下面添加了一个模板:

import wx
import wx.lib.inspection


class MyRegion(wx.Frame):
    I = 0

    def __init__(self, parent):
        wx.Frame.__init__(self, parent, title="My Region")
        gridSizer = wx.GridBagSizer()

        gridSizer.Add(self.CreateStaticBoxSizer(4), pos=(0,0), span=(4,1), flag=wx.EXPAND)
        gridSizer.Add(self.CreateStaticBoxSizer(4), pos=(4,0), span=(4,1), flag=wx.EXPAND)
        gridSizer.Add(self.CreateStaticBoxSizer(4), pos=(0,1), span=(4,1), flag=wx.EXPAND)
        gridSizer.Add(self.CreateStaticBoxSizer(8), pos=(0,2), span=(7,1), flag=wx.EXPAND)
        gridSizer.Add(self.CreateStaticBoxSizer(6), pos=(0,3), span=(6,1), flag=wx.EXPAND)

        self.SetSizer(gridSizer)
        for item in gridSizer.Children:
            for r in range(0, gridSizer.GetEffectiveRowsCount()):
                print(item.GetSize())

    def CreateStaticBoxSizer(self, x=4):
        box = wx.StaticBox(parent=self, label="StaticBox::" + str(MyRegion.I))
        MyRegion.I += 1
        sz = wx.StaticBoxSizer(orient=wx.VERTICAL, box=box)
        for i in range(x):
            sz.Add(wx.StaticText(parent=sz.GetStaticBox(),
                                 label="This window is a child of the staticbox"))
        return sz


if __name__ == "__main__":
    app = wx.App()
    frame = MyRegion(None)
    frame.Show()
    wx.lib.inspection.InspectionTool().Show()
    app.MainLoop()

1 个答案:

答案 0 :(得分:1)

GetChildren()返回的项目只是添加到sizer中的项目的集合,按添加顺序排列。在Classic中,项目是wx.SizerItem个对象,因此您无法获得有关位置或跨越它们的任何信息。但是在Phoenix中,它们是wx.GBSizerItem个对象,因此如果需要,您可以使用GetPos在网格中找到它们的位置。

要按网格顺序迭代项目,您可以使用FindItemAtPosition,如果请求的位置没有项目,则返回wx.GBSizerItemNone。所以这样的事情应该能满足你的需求:

for row in gridSizer.GetEffectiveRowsCount():
    for col in gridSizer.GetEffectiveColsCount():
        item = gridSizer.FindItemAtPosition((row, col))
        if item is not None:
            print(item.GetSize())