wxpython では、いくつかの入れ子になったサイザーとボタンを含む GridBagSizer gs を単一のセルに持ってs1
いs2
ます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
これは、これまでグリッドにあったすべてのケースで機能するようです。この時点ではよくわかりません。後でコードを掘り下げる必要があります。あとは、これを機能させるだけです。