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後で追加されたウィジェット ウィジェットをパックすることを拒否します。

4

2 に答える 2

10

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

Tk でのウィジェットのデフォルトのスタック順序は、ウィジェットの作成順序によって決まります。ウィジェットが作成されるのが早ければ早いほど、積み重ね順は低くなります — 画面自体が z 座標ゼロにあり、画面から手前に向かって値が増加していると考えてください。作成された最初のウィジェットのスタック順序はゼロ、2 番目のウィジェットのスタック順序は 1 などです。

問題の最も簡単な解決策は、ウィジェットを正しい順序で作成することですが、表示された順序でウィジェットを作成することに固執している場合は、後でスタック順序を手動で変更して、ウィジェットが確実にスタックされるようにすることができますあなたが望む順序で。たとえば、青いフレームを再び上に移動するには、次のように追加できます。

raise .top .root

これは Tk に.top"above" になるようにのスタック順序を変更するように指示し.rootます。

ペイン ウィンドウ ウィジェットを使用するときは、子ウィジェットを管理する傾向があります。私にとって、それは概念的には追加の動作を備えたフレームにすぎません。また、フレームを使用して関連するウィジェットをグループ化するため、ペイン ウィンドウも同じように使用します。また、このポリシーは、最初にペイン ウィンドウを作成する必要があるため、重ね順の問題を巧みに回避します — ウィジェット自体が作成されるまでウィジェットの子を作成できないため、作成する必要があります。したがって、この例を次のように変更します。

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 つのフレームは、ペイン ウィンドウの「内側」にあります。自然な積み上げ順序がたまたま正しいものであり、誰もが満足しています。

于 2009-08-11T07:07:06.343 に答える
3

うわー、Tcl/Tk について考えるのも久しぶりです。思い出の旅をありがとう。:)

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

お役に立てれば。

于 2009-08-11T06:29:16.683 に答える