1

私は Tcl/Tk に比較的慣れていませんが、ここ数週間ノンストップで、かなり成功裏に作業を進めてきました。ほとんどの場合、それはかなり簡単に思えます。しかし、最近問題が発生しました。これはおそらく単純ですが、理解できないようです。

問題を示すために、かなり複雑なコードを数行に減らしました。

私の単純な例では、それぞれに単純なラベル ウィジェットを持つ 2 つのラベルフレームを生成します。メイン ウィンドウのサイズを変更 (つまり、展開) するとき、「左」のフレームは y 方向のみにサイズ変更し、「中央」のフレームは x と y 方向にサイズ変更します。それらの部品は正常に機能します。

ただし、サイズを変更したときにフレームが互いに「スタック」したままになることも望んでいます。つまり、両方のサイズが変更されたときに、「中央」のフレームが「左」のフレームに対してくっついたままになるようにします。代わりに、両者の間にギャップが拡大しているのが見えます。

繰り返しますが、これはより複雑なプログラムからの単純化されたコードです。同じプログラムで grid と pack コマンドを混在させないようにしていますが、元のより複雑なプログラムでは、 grid の使用が非常に扱いにくくなりました。したがって、「pack」を使用したソリューションが優先されます。しかし、適切な説明は良い出発点です。

私の小さな例:

 #!/usr/bin/wish

 ## Set up two main frames
 set frameLeft [labelframe .frameLeft]
 set frameMiddle [labelframe .frameMiddle]

 pack $frameLeft -fill y -expand 1
 pack $frameMiddle  -fill both -expand 1 
 pack $frameLeft $frameMiddle -side left -anchor nw

 ## Instead of the previous 3 lines, I also tried:
 #pack $frameLeft -fill y -expand 1 -side left -anchor nw
 #pack $frameMiddle  -fill both -expand 1 -side left -anchor nw

 ## Set up component in LEFT frame
 set frameOne [labelframe $frameLeft.frameOne]
 set labelOne [label $frameOne.labelOne -text "Label One:"]

 pack $labelOne -anchor nw
 pack $frameOne -anchor nw

 ## Set up component in MIDDLE frame
 set frameTwo [labelframe $frameMiddle.frameTwo]
 set labelTwo [label $frameTwo.labelTwo -text "Label Two:"]

 pack $labelTwo -side left
 pack $frameTwo -anchor nw
4

2 に答える 2

3

まず、複雑なレイアウトをデバッグするときに、フレームに派手な色を付けると通常は役立ちます。確かに、それらを本番環境に残すことはありませんが、使用しているジオメトリ マネージャーの動作を理解するのがはるかに簡単になります。

あなたのコードを試してみると、2 つのウィジェットが両方とも水平方向に同じ量のスペースを割り当てられていることがわかります。.frameLeftウィジェットはそのスペースの左側にくっついていますが、ウィジェット.frameMiddleは割り当てられたスペースを埋めています。したがって、問題は「スペース パケット」のウィジェットの動作ではなく、むしろスペースの割り当てです。

ではpack、余分なスペースの割り当ては-expandオプションによって制御されます。余分なスペースは、拡張が有効になっているパケット間で共有されます。これは、必要なレイアウトを取得するには、単純にを設定しないことを意味します。-expand 1.frameLeft

于 2012-07-31T21:27:38.760 に答える
0

あなたが「パック」の答えを好むことは理解していますが、「スティッキー」オプションは扱いやすいセマンティックで塗りつぶしと展開を処理するため、通常、グリッドははるかに扱いやすくなります。あなたがそれで問題を抱えていたことに、私は少し驚いています。残念ながら、私は「グリッド」思考に縛られています。次の「グリッド」ソリューションは、あなたが探しているものを実行しますか?

#!/usr/bin/env wish

## Set up two main frames
set frameLeft [labelframe .frameLeft]
set frameMiddle [labelframe .frameMiddle]

grid $frameLeft -row 0 -column 0 -sticky nse
grid $frameMiddle -row 0 -column 1 -sticky nsew
grid columnconfigure . {0 1} -weight 1
grid rowconfigure . 0 -weight 1

## Set up component in LEFT frame
set frameOne [labelframe $frameLeft.frameOne]
set labelOne [label $frameOne.labelOne -text "Label One:"]

grid $frameOne -sticky nw
grid $labelOne -sticky nw

## Set up component in MIDDLE frame
set frameTwo [labelframe $frameMiddle.frameTwo]
set labelTwo [label $frameTwo.labelTwo -text "Label Two:"]

grid $frameTwo -sticky nw
grid $labelTwo -sticky nw
于 2012-07-31T21:26:50.553 に答える