2013-07-23 66 views
0

在wxpython中,我有一個GridBagSizer,gs,在一個單元中有一些嵌套的sizer s1s2以及一個按鈕b什麼是在嵌套sizer中查找「父」sizer的最佳方式?

EVT_BUTTON事件中,我得到按鈕對象。要將網格中的按鈕對象移動到不同的網格單元,我需要移動GridBagSizer的gs直接「子」(如果這是正確的術語)的頂級sizer,s1。找到最高級別的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)) 

答案(到目前爲止):我發現了一段代碼的,我不知道是誰的信用 - 似乎有事情做與達博。它在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

有GetContainingSizer小部件方法,它會給你sizer的小部件已被添加到,但由於sizer不跟蹤他們的父母,只有他們的孩子,沒有辦法從sizer到sizer,它正在被管理,如果有的話。 – RobinDunn

回答

0

不,您不需要在sizer中存儲引用,但您必須存儲對sizer的引用。讓你的sizer定義像這樣:

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

然後你可以訪問你的應用程序中其他地方的sizer,並根據需要添加或刪除小部件。

+0

感謝Mike,我希望不必跟蹤他們,由於數量龐大。實際的代碼有很多級別的sizer,並且對於保持跟蹤會很糟糕這就是爲什麼我在sizer裏面考慮給h做一個sizer._dales_parent_sizer變量老了吧。 正如我在羅賓斯的帖子中提到的那樣 - 我會發布我找到的答案。 – dale

3

我有時候做的一個技巧就是採用我正在使用的sizer管理的一個小部件,獲取它的父項,然後獲取父項的sizer。除非你正在做的事情非常奇怪,應該是你正在使用的分級機的頂級父施膠機(或篩分器本身,如果它是一個在該層次結構的頂部。

parentSizer = widget.GetParent().GetSizer()

+0

這是一個好主意 - 不幸的是它不會在這種情況下工作,我有窗口(小部件)所有設置與主wxPanel的父母,以及很多級別的sizer之前深入到我正在尋找的sizer。因此,您的示例代碼將返回wxPanel的wxBoxSizer,它的層次遠高於GridBagSizer的水平,因此它是單元格,並且我不知道它將是哪個子sizer,並且我認爲它會通過多層從頂部的尺寸。 謝謝 – dale

+0

我找到了一個答案,我會在上面發表我的原創。在那裏也有一個問題。 – dale

相關問題