python – 在多个Tkinter LabelFrame之间使用网格对齐小部件

我正在尝试创建一个Tkinter布局,其中标签和输入字段在多个LabelFrame框中垂直对齐.

这是一些简化的代码:

#!/usr/bin/python
from Tkinter import *

win = Frame()
win.grid(sticky=N+S+E+W)

frame_a = LabelFrame(win, text='Top frame', padx=5, pady=5)
frame_b = LabelFrame(win, text='Bottom frame', padx=5, pady=5)
frame_a.grid(sticky=E+W)
frame_b.grid(sticky=E+W)

for frame in frame_a, frame_b:
    for col in 0, 1, 2:
        frame.columnconfigure(col, weight=1)

Label(win, text='Hi').grid(in_=frame_a, sticky=W)
Label(win, text='Longer label, shorter box').grid(in_=frame_b, sticky=W)

Entry(win).grid(in_=frame_a, row=0, column=1, sticky=W)
Entry(win, width=5).grid(in_=frame_b, row=0, column=1, sticky=W)

win.mainloop()

上面的代码生成一个如下所示的窗口:

虽然我想找到一些对齐字段的方法,所以窗口看起来更像这样(感谢MS Paint):

我已经玩过grid()的in_参数,但没有取得很大的成就,我想不出任何其他的东西可以试验.

最佳答案 简短的回答是:你不能做你想做的事. grid不会跨多个容器管理其行和列.

但是,至少有几种方法可以达到您想要的效果.一种方法是为每个容器中的第一列提供明确的相同宽度.为此,您可以使用grid_columnconfigure方法为每列提供最小宽度.

另一种解决方案是为每个标签赋予相同的宽度,这有效地将第一列的宽度设置为相同(假设每个容器中的所有列具有相同的重量).

点赞