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

时间:2013-07-23 15:53:44

标签: 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))

答案(到目前为止):我发现了一段我不知道应该归功于哪些代码 - 似乎与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

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

2 个答案:

答案 0 :(得分:5)

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

parentSizer = widget.GetParent().GetSizer()

答案 1 :(得分:0)

不,您不需要在sizer中存储引用,但是您必须存储对sizer的引用。像你这样制作你的sizer定义:

self.gs = wx.GridBagSizer()
self.s1 = wx.BoxSizer()
self.s2 = wx.BoxSizer()

然后,您可以根据需要访问应用程序中其他位置的sizer以及“添加或删除小部件”。