左側にパックされている既存のウィジェットの下に tkinter ウィジェットをパックするにはどうすればよいですか?
質問
私は基本的な Tkinter GUI を作成しようとしています。 Text
上部にあるウィジェット、次に Button
ウィジェットをその下に左に揃えてから、別のウィジェットを配置します 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()
では、2 番目の設定を行うにはどうすればよいでしょうか Text
ウィジェットをボタンの右側ではなく、ボタンの下に表示するように変更しますか?
解決
レイアウトの問題には通常、次の 2 つの解決策があります。
グリッドの使用に切り替えます。達成しようとしているようなレイアウトを行うのが非常に簡単になります。Grid は、おそらくすべてのレイアウトの問題の 95% を解決できます (よく考えると驚くべきことです。ほとんどのツールキットが達成するために 6 個のツールキットが必要なことを、Tk は 1 人のマネージャーで実行します!)
複数のフレームを使用します。一部のウィジェットを上から下に、また一部を左から右に積み重ねる必要がある場合、すべてを 1 つのフレームに詰め込むと、常に希望する結果が得られるとは限りません。レイアウトの上から下の部分に 1 つのフレームを使用し、左から右のコンテンツに追加のフレームを使用します。
また、ウィジェットは、パック/グリッド化されているウィジェットの子である必要がないことにも注意してください。「in」パラメータを使用すると、ウィジェットを親以外のコンテナに配置できます。
たとえば、特定の例では、上、中央、下の 3 つのフレームを作成できます。これらをトップレベル ウィンドウに上から下に詰め込みます。次に、最初のテキスト ウィジェットを上部に、ボタンを水平方向に中央に、その他のテキスト ウィジェットを下部に配置できます。
このようなアプローチの利点は、将来レイアウトを変更するのがはるかに簡単になることです (私の経験では いつも ある時点で起こります)。ウィジェットの親を変更する必要はなく、他のコンテナにそれらをパック/配置/グリッドするだけです。
短い例では大きな違いはありませんが、複雑なアプリの場合、この戦略は命を救う可能性があります。
私の最善のアドバイスは次のとおりです。レイアウトは後付けではありません。少し計画を立てて、5 分間かけて方眼紙に絵を描いてみてください。まず、アプリの主要な領域を決定し、それぞれにフレームまたはその他のコンテナ (ペイン ウィンドウ、ノートブックなど) を使用します。これらを取得したら、各セクションに対して同じ分割統治アプローチを実行します。これにより、アプリのさまざまなセクションにさまざまなタイプのレイアウトを使用できるようになります。ツールバーは水平レイアウトになり、フォームは垂直レイアウトになる場合があります。
他のヒント
私は当初、パッキンが働いてどのように誤解されたと私はx.pack(side=LEFT)
をしたときの全体の左側は「主張」されていたことを実現していませんでした。私はこのとここにアレックスによって答えは、私がした後、実際にはなかったということです読んだ後に見つけたものx
は全く左側に詰めではなく、代わりにanchor=W
の(西のためW)side=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
はもう、左側を「主張」、それはちょうど左(または西)に並んだスペースのそのブロック内でされていません。
梱包は、xがそれはそれだ、左側の「主張」しているかつてので.packメソッドは、呼ばれている順序で起こります右。
:あなたは....例えば、「仲介」するフレームを必要とします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は明らかにテキストを表示しませんが、ボタンは非常に明確である; - )
。これは、WebViewのは、モザイクキャンバスウィジェットを使用しないのと同じように(Tkのに非常によく似ている)の内部を設定してください。それの後に置かすべてのものと、すでに自動的にそれの内側にオーバーを開始します「FR」を呼び出してすべてのための;:トリックは、第二の同一の名前のFrameオブジェクトは、ブロックレベルのフロート(ブロックインライン)として動作することです。
あなたはTOP整列ウィジェットのこれをやって多くを持っているし、単にあなたが側= LEFTの間を壊したく別の同一の名前のフレームを追加することができます。また、ボトムの後に動作します。
fr=Frame(root)
fr.pack(fill=X, side=TOP)
block1=Label(fr)
block1.pack(side=LEFT)
block2=Label(fr)
block2.pack(side=LEFT)
block3=Button(fr)
block3.pack(side=LEFT)
# NAME IT THE SAME ID NAME AS THE FIRST MAIN FRAME...
fr=Frame(root)
fr.pack(fill=X, side=TOP)
# These NOW jump into the second Frame breaking the side=LEFT in new Frame
block4=Label(fr)
block4.pack(side=LEFT)
block5=Label(fr)
block5.pack(side=LEFT)
# AND THEY CONTINUE GOING side=LEFT AFTERWARDS.