12

Text上部にウィジェットがあり、その下にウィジェットが配置され、ボタンの下にButton別のウィジェットがある基本的な Tkinter GUI を作成しようとしています。Text私が抱えている問題は、Buttonウィジェットを左にパックした後、2 番目のTextウィジェットをパックしようとすると、ボタンの下ではなく、右側のボタンの隣に配置されることです。これはside、2 番目のウィジェットの引数の設定に関係なく発生Textします。この動作を示す簡単なコードを次に示します。

from Tkinter import *

root = Tk()

w = Text(root)
w.pack()

x = Button(root, text="Hi there!")
x.pack(side=LEFT)

y = Text(root)
y.pack(side=BOTTOM)

root.mainloop()

Textでは、2 番目のウィジェットをボタンの右側ではなく、ボタンの下に表示するように設定するにはどうすればよいでしょうか。

4

4 に答える 4

17

一般に、レイアウトの問題には 2 つの解決策があります。

  1. グリッドの使用に切り替えます。あなたが達成しようとしているようなレイアウトを行うのが本当に簡単になります。グリッドは、おそらくすべてのレイアウトの問題の 95% を解決できます (考えてみると驚くべきことです。Tk は、ほとんどのツールキットが達成するために半ダースのマネージャーを必要とすることを、1 つのマネージャーで解決します!)

  2. 複数のフレームを使用します。一部のウィジェットを上から下に、一部を左から右に積み重ねる必要がある場合、単一のフレームにすべてを詰め込んで欲しいものを常に得ることができるとは限りません。レイアウトの上から下の部分に 1 つのフレームを使用し、左から右のコンテンツに追加のフレームを使用します。

また、ウィジェットは、それらがパック/グリッドされているウィジェットの子である必要はないことに注意してください。「in」パラメーターを使用して、ウィジェットを親以外のコンテナーに配置できます。

たとえば、特定の例では、上、中、下の 3 つのフレームを作成できます。トップレベル ウィンドウでこれらを上から下にパックします。次に、最初のテキスト ウィジェットを上部に、1 つまたは複数のボタンを水平方向に中央に、もう 1 つのテキスト ウィジェットを下部にパックできます。

このようなアプローチの利点は、将来レイアウトを変更することがはるかに簡単になることです (私の経験では、常にある時点で発生します)。ウィジェットを再ペアレント化する必要はありません。他のコンテナにパック/配置/グリッドするだけです。

あなたの短い例では大きな違いはありませんが、複雑なアプリの場合、この戦略は命の恩人になる可能性があります.

私の最善のアドバイスは次のとおりです。レイアウトは後付けではありません。少し計画を立てて、方眼紙に 5 分間描いてみてください。最初にアプリの主要な領域を決定し、それぞれにフレームまたはその他のコンテナー (ペイン ウィンドウ、ノートブックなど) を使用します。それらを取得したら、各セクションに対して同じ分割統治アプローチを実行します。これにより、アプリのさまざまなセクションにさまざまなタイプのレイアウトを使用できます。ツールバーは水平レイアウトになり、フォームは垂直レイアウトになる場合があります。

于 2009-09-29T11:40:58.333 に答える
9

私は当初、パッキングがどのように機能するかを誤解していましたx.pack(side=LEFT)これとアレックスの答えを読んだ後に私が見つけたのは、実際xには左側に詰め込んだ後ではなく、代わりに (W for West)を使用して左側に固定したことです。私がしたことをする私の修正されたコードスニペットは次のようになります:anchor=Wside=LEFT

from tkinter import *

root = Tk()

w = Text(root)
w.pack()

x = Button(root, text="Hi there!")
x.pack(anchor=W)

y = Text(root)
y.pack(side=BOTTOM)

root.mainloop()

この方法xはもはや左側を「主張」するのではなく、スペースのブロック内で左側 (または西側) に配置されるだけです。

于 2009-09-28T06:22:03.283 に答える
3

パッキングは .pack メソッドが呼び出された順序で行われるため、x が左側を「要求」すると、それだけです。つまり、親の左側部分が使用され、親内の他のすべてが右側になります。「仲介」するにはフレームが必要です。たとえば...:

from Tkinter import *

root = Tk()

w = Button(root, text="Mysterious W")
w.pack()

f = Frame(root)
x = Button(f, text="Hi there!")
x.pack()

y = Button(f, text="I be Y")
y.pack(side=BOTTOM)

f.pack(side=LEFT)

root.mainloop()

(テキストをボタンに変更して、レイアウトのみをより迅速に表示できるようにしました。この Mac の Tkinter では、テキストがフォーカスされるまで明確に表示されませんが、ボタンは非常に明確です;-)。

于 2009-09-28T05:15:17.410 に答える