2009-08-11 12 views
1

次のコードは正常に動作します。それは上部の青い箱と下の緑色のボックスで、panedwindowが表示されます。ウィジェットの作成順序が重要なのはなぜですか?

panedwindow .root -orient vertical -showhandle true -background red 
frame .top -background blue -width 100 -height 100 
frame .bot -background green -width 100 -height 100 
.root add .top .bot 
pack .root -expand true -fill both 

をしかし、私はpanedwindowコマンドを下に移動すると、物事が動作を停止します。上部の青色のボックスは表示されません。代わりに、panedwindowの赤色が光ります。

frame .top -background blue -width 100 -height 100 
panedwindow .root -orient vertical -showhandle true -background red 
frame .bot -background green -width 100 -height 100 
.root add .top .bot 
pack .root -expand true -fill both 

なぜこのようなことが起こりますか? panedwindowは実際にそれ以降に作成されたウィジェットだけを管理できますか?私は後で来るウィジェット-inウィジェットをパックすることを拒否するパッカーと同様の動作を見てきました。

答えて

10

マットが指摘したように、スタックする順序とすべて関係します。 Stacking Orderはアプリ内のウィジェットの「z座標」にすぎません。—あなたは画面上にある自然なx座標とy座標に加えて、画面の平面に垂直な別の軸があるかのように考えることができます画面。すべてのウィジェットはこの軸のどこかに置かれています。実際に画面に表示される画像は、すべてのウィジェットをその軸に沿って一緒に「平坦化」した結果です。ウィジェットがxとy平面で重なっているところでは、スタックする順番の高いウィジェットがその場所に表示されます。

Tkのウィジェットのデフォルトのスタック順序は、作成順序によって決まります。先に作成したウィジェットは、積み重ね順に下になります—スクリーン自体がz座標ゼロであると考えて、画面からあなたに向かってくる値が増えています。作成された最初のウィジェットには、重複順が0、2番目にウィジェットがあります。

問題の最も簡単な解決策は、表示されている順序で、後で積層順序を手動で変更して、ウィジェットが必要な順序で積み重なるようにすることができます。例えば、再びトップにあなたの青色の枠を持って、あなたが追加することができます:

raise .top .root 

これは.root「上」になるように.topの重なり順を変更するにはTkのを伝えます。

私はpanedウィンドウウィジェットを使用すると、子ウィジェットを管理する傾向があります。—私には概念的には余分な振る舞いを持つフレームです。フレームを使用して関連するウィジェットをグループ化するので、同じ方法。ウィジェット自体が作成されるまで、ウィジェットの子を作成することはできないため、最初にのパンウィンドウを作成する必要があるので、この方針は積み重ね順序の問題をきちんと回避します。したがって、私はこのようなあなたの例を変更します:私に

panedwindow .root -orient vertical -showhandle true -background red 
frame .root.top -background blue -width 100 -height 100 
frame .root.bot -background green -width 100 -height 100 
.root add .root.top .root.bot 

、これは.root.root.top.root.bot明確な関係を作る:2つのフレームをペイン・ウィンドウ「内部」です。自然な積み重ね順序が正しいものになり、誰もが満足しています。

+0

私はそれを見ていることが明らかになったようです。助けてくれてありがとう! –

3

私はTcl/Tkについても考えていたので、しばらくお待ちください。メモリレーンを降りてくれてありがとう。 :)

これによると、兄弟ウィジェットのデフォルトの積み重ね順序は、梱包された順序ではなく、作成された順序です。本質的に、.top、.bot、および.rootはウィジェット階層内の同じレベルにあるため、つまり、すべて同じ親(この場合は '。')からすべてハングしているため、お互いの兄弟です。 panedwindowコマンドをもう1行下に移動すると、緑色のボックスも表示されません。 .topと.botの名前をそれぞれ.root.topと.root.botに変更すると、あなたが見ている問題を修正する可能性があります。ルートの親の子になるためです。

これが役に立ちます。

+0

非常に簡潔で非常に有用な応答ありがとう!私はちょうどTcl/Tkを使い始めています。彼らが何をしているかを知っている誰かから助けを得ることは素晴らしいことです。 –

関連する問題