使用网格几何管理器的默认行为是列将尽可能小,因此您不需要做任何事情(假设您正确使用网格)。
您描述的元素之间空间过大的行为可能是由于您在同一列中有其他更宽的小部件。该列将默认为可容纳最宽项目的最小宽度。那,或者在您的代码中的其他地方,您为导致它们扩展的某些列赋予非零权重。
在我谈论解决方案之前,让我确保您使用网格将多个小部件放在同一个单元格中的方式很明显是错误的方式。绝对没有理由诉诸这样的解决方案。一般的经验法则是,您永远不应该在一个单元格中放置多个小部件。
对您来说最简单的解决方案是结合 grid 和 pack。将所有复选按钮放在一个框架中,并将它们打包在该框架的左侧。然后,使用 . 将框架放入网格中sticky="w"
。然后,无论窗口有多大,检查按钮都将始终粘在其包含框架的左侧。
请注意,此解决方案不会违反我之前提到的经验法则。您只需将一个小部件放在一个单元格中:框架。您可以在该内部框架中放置您想要的任何内容,但从网格的角度来看,网格的每个单元格中只有一个小部件。
这是一个基于 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()
当然,您也可以将复选按钮放在单独的列中——这通常是最简单的——但您可能需要让其他行中的其他项目跨越多个列并处理列权重。由于根据您的描述尚不清楚您的问题究竟是什么,因此上述解决方案可能对您来说是最简单的。