0

wxpython では、いくつかの入れ子になったサイザーとボタンを含む GridBagSizer gs を単一のセルに持ってs1s2ます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

私が時々行ったトリックは、使用しているサイザーによって管理されているウィジェットの 1 つを取得し、その親を取得してから、親のサイザーを取得することです。使用しているサイザーのトップレベルの親サイザー (または、その階層の最上位にあるサイザーである場合はサイザー自体) である必要がある、本当に奇妙なことをしていない限り。

parentSizer = widget.GetParent().GetSizer()

于 2013-07-24T03:44:41.590 に答える
0

いいえ、サイザーに参照を保存する必要はありませんが、サイザーへの参照を保存する必要があります。次のようにサイザーを定義します。

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

次に、アプリケーションの他の場所にあるサイザーにアクセスし、必要に応じてウィジェットを追加または削除できます。

于 2013-07-23T20:09:47.797 に答える