グリッド ジオメトリ マネージャーを使用する場合のデフォルトの動作では、列が可能な限り小さくなるため、何もする必要はありません (グリッドを適切に使用している場合)。
要素間のスペースが多すぎる場所で説明した動作は、おそらく同じ列に幅の広い他のウィジェットがあるためです。列は、最も幅の広い項目に対応する最小の幅にデフォルト設定されます。それ、またはコードの他の場所で、それらの列の一部にゼロ以外の重みを与えて、それらを拡張させています。
解決策について話す前に、グリッドを使用して複数のウィジェットを同じセルに配置する方法は、間違いなく間違っていることを明確にしておきましょう。そのような解決策に頼る理由はまったくありません。一般的な経験則では、1 つのセルに複数のウィジェットを配置しないでください。
最も簡単な解決策は、グリッドとパックを組み合わせることです。すべてのチェックボタンをフレームに入れ、そのフレームの左側にまとめます。次に、フレームをグリッドに配置しますsticky="w"
。次に、ウィンドウがどれだけ大きくなっても、チェックボタンは常にそれを含むフレームの左側に固定されます。
このソリューションは、前述の経験則を破るものではないことに注意してください。セルには 1 つのウィジェット、つまりフレームを配置するだけです。その内側のフレームには何でも入れることができますが、グリッドの観点から見ると、グリッドの各セルには 1 つのウィジェットしかありません。
これは、python 2.7 に基づく実際の例です。
import Tkinter as tk
class ExampleView(tk.Frame):
def __init__(self, *args, **kwargs):
tk.Frame.__init__(self, *args, **kwargs)
cbframe = tk.Frame(self)
cb1 = tk.Checkbutton(cbframe, text="Choice 1")
cb2 = tk.Checkbutton(cbframe, text="Choice 2")
cb3 = tk.Checkbutton(cbframe, text="Choice 3")
cb1.pack(side="left", fill=None, expand=False)
cb2.pack(side="left", fill=None, expand=False)
cb3.pack(side="left", fill=None, expand=False)
# this entry is for illustrative purposes: it
# will force column 2 to be widget than a checkbutton
e1 = tk.Entry(self, width=20)
e1.grid(row=1, column=1, sticky="ew")
# place our frame of checkbuttons in the same column
# as the entry widget. Because the checkbuttons are
# packed in a frame, they will always be "stuck"
# to the left side of the cell.
cbframe.grid(row=2, column=1, sticky="w")
# let column 1 expand and contract with the
# window, so you can see that the column grows
# with the window, but that the checkbuttons
# stay stuck to the left
self.grid_columnconfigure(1, weight=1)
if __name__ == "__main__":
root = tk.Tk()
view = ExampleView(root)
view.pack(side="top", fill="both", expand=True)
root.wm_geometry("400x200")
root.mainloop()
もちろん、チェックボタンを別々の列に配置することもできますが、これは多くの場合最も簡単ですが、他の行の他のアイテムを複数の列にまたがらせ、列の重みを処理する必要がある場合があります。説明に基づいて問題が正確に何であるかが明確ではないため、上記の解決策がおそらく最も簡単です。