5

過去にグリッドとパックについて多くの質問があったことは知っていますが、「テーブル」を両方向(行/列)に拡張するのが難しいため、2つを組み合わせる方法がわかりません。

ボタン同じサイズを維持したいのですが、常にウィンドウの下部にとどまります。「テーブル」は、ウィンドウのサイズを変更して自動的に拡張したいのですが、機能しないようです。'win1'をpackに変更すると、中央に留まるという意味で機能しましたが、それだけです。

用語を変更する必要があるとわかっているので、パックを使用してスティッキーなどの同じ効果をどのように達成できますか。

コードは次のとおりです(完全なコードではなく、基本的なフレームといくつかのウィジェットを示しています)。

root = Tk()  

win1 = Frame(root)
win1.pack()
win1.grid_columnconfigure(0, weight=1)
win1.grid_rowconfigure(1, weight=1)

frame_table = ttk.Frame(win1, style="Black.TLabel", relief='sunken', borderwidth=1)
frame_table.pack(row=2, column=0, padx=1, pady=1, sticky= "nsew")
frame_table.grid_columnconfigure(0, weight=1)
frame_table.grid_rowconfigure(1, weight=1)
text_table1 = Label(frame_table, text='Number1', bg='white', borderwidth=0)
text_table1.grid(row=1, column=0, sticky="nsew", padx=1, pady=1)
empty1 = Label(frame_table, bg='white', borderwidth=0)
empty1.grid(row=2, column=0, sticky="nsew", padx=1, pady=1)
text_table2 = Label(frame_table, text='Number2', bg='white', borderwidth=0, width=12)
text_table2.grid(row=1, column=1, sticky="nsew", padx=1, pady=1)
empty2 = Label(frame_table, bg='white', borderwidth=0)
empty2.grid(row=2, column=1, sticky="nsew", padx=1, pady=1)

frame_but = ttk.Frame(win1)
frame_but.grid(sticky=S, padx=1, pady=1)
frame_but.grid_columnconfigure(0, weight=1)
frame_but.grid_rowconfigure(1, weight=1)
but1 = ttk.Button(frame_but, text='Start', command=Start)
but1.grid(row=3, column=0, padx=2, pady=1, sticky="S")
4

1 に答える 1

18

最初の問題は、メインフレームにwin1オプションがないことです。デフォルトでは、コンテナの中にある部分を埋めないようになっています。したがって、内部ウィジェットに対して何を行っても、すべてがウィンドウの上部にスタックアンカーされます。次に、最初にすべきことは、win1ウィンドウ全体を埋めるように指示することです(実際にそれを実行したいと仮定します)。

win1.pack(side="top", fill="both", expand=True)

これにより、ウィンドウのサイズを変更したときに、このフレームが適切に拡大および縮小されます。

2番目の問題は、行0にwin重み1をframe_table指定しているが、デフォルトの重みが0である行3に入力していることです。これが意図的なものかどうかはわかりませんが、それがラベルを保持している理由です。の空の行0win1が拡大および縮小して余分なスペースを占有しているため、エントリウィジェットは画面の下部に固定されています。

ウィジェットのレイアウトを学ぶ方法

適切なサイズ変更の動作を正しく行うのは非常に簡単ですが、正しく行う方法を学ぶのはかなり困難です。私のおすすめは、紙と鉛筆を用意することです。アプリケーションの主要な領域、つまりそれぞれが異なるプロパティを持つ領域を描画します。たとえば、下部にとどまる必要がある下部に沿った行(ステータスバー、またはボタンの行など)。おそらく、上部にあるもの(ツールバーなど)が上部に留まる必要があります。通常、拡張可能な領域は1つだけですが、拡張可能な領域自体は2つ以上の領域に分割される場合があります。

この場合、テーブルとボタンの行の2つの領域があると思います。これを引き出すのは簡単です。次に、各リージョンのフレームを作成し、各リージョンのフレームのみを作成します。それらに別々の背景色を与え、グリッドまたはパックのどちらかを使用してウィンドウに配置します。どちらかが必要なサイズ変更動作を提供します。単純なレイアウト(すべての領域が上から下または左から右に貼り付けられている)の場合はパックが最適です。本当にグリッドがある場合はグリッドが最適です。これだけで作業し、メインリージョンに必要な動作が得られるまでオプションを微調整します。異なる色は、どの領域がサイズ変更されているか、どの領域がサイズ変更されていないかを確認するのに役立ちます。

メインリージョンが正確に機能するようになったら、内側の部分に焦点を合わせ始めることができます。その鉛筆と紙をもう一度取り出して、これらの各サブリージョンで同じことを行います。内側の領域を引き出し、コンテナ内で成長する領域と成長しない領域を特定します。たぶん、メインのサブリージョンは1つしかないので、この部分はスキップできます。最後に、サブリージョンがある場合はフレームを作成し、サイズを変更していることを確認できるように、フレームに異なる色を付けます。すべてが希望どおりにサイズ変更されるまで、設定を微調整します。泡立てて、すすぎ、繰り返します。

最後に、ウィンドウを細分割することはできなくなります。通常、リージョンは2、3しかないため、このプロセスは迅速です。プログラムのさまざまな領域をすべて希望どおりにサイズ変更したら、実際のウィジェットを追加します。それが終わったら、戻ってフレームから色を削除することができます。

シンプルですが、系統だったアプローチが必要です。たくさんのウィジェットをフレームに投げ込み、それを機能させるためにランダムなことを試みることは正しいアプローチではありません。整然として、紙にデザインをレイアウトし、異なる色のフレームに転送してから、実際のウィジェットを追加して、最終的な仕上げを追加します。

于 2012-06-29T11:31:56.780 に答える