在wxpython中,我在单个单元格中有一个GridBagSizer、gs和一些嵌套的sizer s1和s2,还有一个按钮b。
在一个EVT_BUTTON事件中,我得到了按钮对象。要将网格中的按钮对象移动到不同的网格单元格,我需要移动顶级的sizer,s1,它是GridBagSizer,gs的直接“子”(如果这是正确的话)。什么是最好的方法找到最高级的筛检器?
object.GetContainingSizer()返回按钮对象的sizer,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这似乎适用于到目前为止我在我的网格中的所有情况。现在我不确定我是否理解它,稍后我将不得不深入研究代码--现在只需要让它工作。
发布于 2013-07-24 03:44:41
我有时做的一个技巧是,使用我正在使用的sizer管理的一个小部件,获取它的父部件,然后获取父部件的sizer。除非您正在做一些非常奇怪的事情,否则应该是您正在使用的测试器的顶级父级测试器(或者,如果它位于该层次结构的顶端,则应该是测试器本身)。
`parentSizer = widget.GetParent().GetSizer()`发布于 2013-07-23 20:09:47
不,您不需要在sizer中存储引用,但是您必须存储对sizer的引用。将您的sizer定义如下:
self.gs = wx.GridBagSizer()
self.s1 = wx.BoxSizer()
self.s2 = wx.BoxSizer()然后,您可以访问应用程序的其他部分,并根据需要添加或删除小部件。
https://stackoverflow.com/questions/17815109
复制相似问题