grid_columnconfigure
中央の列に重みを付けるために使用する必要があります。他の列よりも重量があるため、余分なスペースを埋めるために伸縮します。ただし、あなたの場合、実際にはグリッドを使用する必要はありません。pack
GUI のすべてが、より自然にフィットする特定の側面に沿って配置されます。
pack と grid の両方を使用する方法を示します。pack が最も簡単なので、最初に始めます。どうしても使用したい場合でもgrid
、次のセクションを読んで、1 つの大きなレイアウトの問題を多くの小さなレイアウトの問題に分割する方法を理解してください。
分割統治
Tkinter でレイアウトを行う最善の方法は、「分割統治」です。最も外側のウィジェットから始めて、思いどおりにそれらを取得します。次に、これらのそれぞれに一度に取り組みます。
あなたの場合、最も外側のウィジェットが 1 つあります - メイン コンテナです。これはウィンドウ内の唯一のウィジェットであるため、pack はコンテナー全体を埋める最も簡単な方法です。grid も使用できますが、少し追加の作業が必要です。
self.main_container = Frame(parent. background="bisque")
self.main_container.pack(side="top", fill="both", expand=True)
一時的にフレームに独特の色を付けて、開発中に視覚化できるようにするのに役立ちます. 上記のコードを に追加し__init__
てアプリを実行し、ウィンドウのサイズを変更して、メイン フレームが適切に拡大および縮小することを確認します。
次に、top_frame と bottom_frame の 2 つのフレームがあります。それらの名前と、グリッドを使用しようとした方法から判断すると、GUI を x 方向に埋める必要があると思います。また、上部のフレームはある種のツールバーであり、下部のフレームは GUI の実際の「メイン」部分であると推測しています。したがって、一番下のウィジェットがすべての余分なスペースを占めるようにしましょう。
これらは互いに積み重ねられているため、これもpack
当然の選択です。次のコード (次のコードのみ) を追加して、これらの領域がウィンドウの予想される部分を占め、適切なサイズ変更動作を行うようにします。
self.top_frame = Frame(self.main_container, background="green")
self.bottom_frame = Frame(self.main_container, background="yellow")
self.top_frame.pack(side="top", fill="x", expand=False)
self.bottom_frame.pack(side="bottom", fill="both", expand=True)
次は、ラベルのフレームです。繰り返しになりますが、これらはコンテナーの端に沿ってスペースを占有するためpack
、最も理にかなっています。繰り返しますが、次のコードを少しだけ追加してプログラムを実行し、ウィンドウのサイズが適切に変更され、ウィンドウの適切な部分に表示されることを確認してください。
self.top_left = Frame(self.top_frame, background="pink")
self.top_right = Frame(self.top_frame, background="blue")
self.top_left.pack(side="left", fill="x", expand=True)
self.top_right.pack(side="right", fill="x", expand=True)
次に、「コーナー」ラベルがあります。繰り返しますが、コンテナーは 1 行のウィジェットにすぎpack
ないため、簡単に行うことができます。隅にラベルが必要なのでsticky
、それぞれに少し異なる属性を設定します。
self.top_left_label = Label(self.top_left, text="Top Left")
self.top_right_label = Label(self.top_right, text="Top Right")
self.top_left_label.pack(side="left")
self.top_right_label.pack(side="right")
最後に、テキスト ウィジェットがあります。それは下のフレーム全体を埋め尽くしpack
ます。
self.text_box = Text(self.bottom_frame, height=5, width=40, background="gray")
self.text_box.pack(side="top", fill="both", expand=True)
パックまたはグリッド?
元のコードにグリッドを使用し、それを修正する方法を尋ねました。例に pack を使用したのはなぜですか?
を使用するpack
と、すべての構成オプションを 1 回の呼び出しでまとめることができます。ウィジェットをコンテナにgrid
入れるだけでなく、適切にサイズ変更できるように、さまざまな列や行に「重み」を与えるように注意する必要があります。単にウィジェットを積み重ねたり、一列に並べたりするだけの場合は、pack
はるかに使いやすくなります。
私の GUI では、ほぼ常に と の組み合わせを使用していgrid
ますpack
。どちらも強力で、さまざまなことに優れています。覚えておくべき唯一のこと (これは重要です) は、同じ親でそれらを使用できないということです。コードを例として使用すると、同じ親を共有しているためpack
、top_left フレームと top_right フレームには使用できません。ただし、同じアプリケーション内でそれらを混在させるgrid
ことはできます。
もう一度、グリッドを使用して
わかりましたので、本当に を使いたいと思うかもしれませんgrid
: これは学校の課題かもしれませんし、一度に 1 つのジオメトリ マネージャーに集中したいだけかもしれません。カッコいい。これが私がそれを行う方法です。繰り返しますが、分割して征服する必要があります。
まずはメインフレームから。メイン コンテナをパックする 1 つのステートメントを次の行に置き換えます。作成したフレームではなく、親の行と列を構成する必要があることに注意してください。
self.main_container.grid(row=0, column=0, sticky="nsew")
self.myParent.grid_rowconfigure(0, weight=1)
self.myParent.grid_columnconfigure(0, weight=1)
さて、上枠と下枠です。を削除しpack
、次の行を追加します。まだ 1 列しかありませんが、今回は 2 行あります。重みが 1 になる行に注目してください。
self.top_frame.grid(row=0, column=0, sticky="ew")
self.bottom_frame.grid(row=1, column=0,sticky="nsew")
self.main_container.grid_rowconfigure(1, weight=1)
self.main_container.grid_columnconfigure(0, weight=1)
コーナー フレーム -- ついに、複数の列を持つコンテナーになりました。たるみをすべて埋めるために、真ん中に 3 番目の列を作成しましょう。pack
「重み」が与えられていることに細心の注意を払いながら、ステートメントを次のように置き換えます。
self.top_left.grid(row=0, column=0, sticky="w")
self.top_right.grid(row=0, column=2, sticky="e")
self.top_frame.grid_columnconfigure(1, weight=1)
次に、フレーム内のラベル。それらを拡張する必要がないため、デフォルトの重みをゼロのままにしておくことができます。両方のラベルが列 0 にあるのは奇妙に思えるかもしれません。それらは異なる親にあり、それらは親の唯一のウィジェットであるため、それぞれに 1 つの列しかないことに注意してください。
self.top_left_label.grid(row=0, column=0, sticky="w")
self.top_right_label.grid(row=0, column=0, sticky="e")
最後に、下のフレームにある唯一のウィジェットであるテキスト ウィジェットがあります。最後のpack
ステートメントを次のように置き換えます。
self.text_box.grid(row=0, column=0, sticky="nsew")
self.bottom_frame.grid_rowconfigure(0, weight=1)
self.bottom_frame.grid_columnconfigure(0, weight=1)
結論
ウィジェットのレイアウトは簡単ですが、体系化する必要があります。自分が何をしているのかを考え、ウィジェットをグループに編成してから、一度に 1 つずつグループに取り組みます。これを行うと、どのジオメトリ マネージャーを使用する必要があるかが明らかになります。
ご覧のとおり、 にgrid
はさらに数行のコードが必要ですが、実際にグリッドがある場合は正しい選択です。あなたの場合、すでに GUI をセクションに細分化していたので、最終結果はグリッドでしたが、各セクションは別の上または下、または左端または右端に詰め込まれていました。このような場合、pack
行と列の重みを気にする必要がないので、少し使いやすいです。