在wxpython中,我有一个GridBagSizer,gs,在一个单元格中有一些嵌套的大小调整器s1
和s2
以及一个按钮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
到目前为止,我的网格中的所有情况似乎都有效。我不确定此时是否理解,我将不得不深入研究代码 - 现在只需要完成这项工作。
答案 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以及“添加或删除小部件”。