在嵌套sizer中找到"父"sizer的最佳方法是什么?

dal*_*ale 0 wxpython nested sizer

在wxPython中我有GridBagSizer,GS,与一些嵌套大小测定器s1s2和一个按钮b,在单个小区中.

在一个EVT_BUTTON事件上,我得到了按钮对象.要将网格中的按钮对象移动到不同的网格单元格,我需要移动顶级sizer,s1,这是GridBagSizer的直接"子"(如果这是正确的术语),gs.找到顶级sizer的最佳方法是什么?

object.GetContainingSizer()返回按钮对象的sizer,s2,但我看不到如何到达s1.我是否需要在s2(或b)对象中存储对s1的引用?这看起来相当不优雅?

# pseudocode
panel=wx.Panel( None )
gs= wx.GridBagSizer()
s1= wx.BoxSizer()
s2= wx.BoxSizer()
b= wx.Button(panel, wx.ID_ANY, 'AButton')

s2.Add( b )
s1.Add( s2 )
gs.Add( s1, (row,col))
Run Code Online (Sandbox Code Playgroud)

答案(到目前为止):我发现了一段我不知道应该归功于哪些代码 - 似乎与dabo有关.它在dGridSizer.py中,但它做了类似我正在寻找的东西:

szitm= grid_sizer.FindItemAtPosition( (row,col) )
if szitm:
    if szitm.IsWindow():
        itm=szitm.GetWindow()
    elif szitm.IsSizer():
        itm=szitm.GetSizer()
    try: # in case some other IsSomething() I don't have covered
        grid_sizer.SetItemPosition( itm, (newrow,col))
    except:
        pass
Run Code Online (Sandbox Code Playgroud)

到目前为止,这似乎适用于我在网格中的所有情况.目前还不确定我是否理解它,我将不得不深入研究代码 - 现在只需要完成这项工作.

Rob*_*unn 5

我有时做过的一个技巧是使用我正在使用的sizer管理的一个小部件,获取它的父级,然后获取父级的sizer.除非你正在做一些非常奇怪的事情,应该是你正在使用的sizer的顶层父级sizer(或者如果它是那个层次结构顶部的sizer本身的sizer本身).

parentSizer = widget.GetParent().GetSizer()