0

在 wxpython 中,我在单个单元格中有一个 GridBagSizer、gs、一些嵌套的 sizers1s2一个 button 。b

在一个EVT_BUTTON事件中,我得到了按钮对象。要将网格中的按钮对象移动到不同的网格单元格,我需要移动顶级大小调整器 s1,它是 GridBagSizer gs 的直接“子项”(如果这是正确的术语)。找到顶级尺寸器的最佳方法是什么?

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

# 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

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

4

2 回答 2

5

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

parentSizer = widget.GetParent().GetSizer()

于 2013-07-24T03:44:41.590 回答
0

不,您不需要在 sizer 中存储引用,但您必须存储对 sizer 的引用。使您的 sizer 定义如下:

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

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

于 2013-07-23T20:09:47.797 回答