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

时间:2012-03-18 15:24:57

标签: python user-interface tkinter

我正在尝试创建一个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()

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

Incorrect image produced by above code

而我正在寻找一些对齐字段的方法,以便窗口看起来更像这样(感谢MS Paint):

Desired image

我已经使用了in_ grid() {{1}}个参数,但没有取得很大成就,我想不出任何可以尝试的东西。

2 个答案:

答案 0 :(得分:1)

简短的回答是:你无法做你想做的事。 grid不管理多个容器中的行和列。

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

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

答案 1 :(得分:1)

我知道做你想做的最简单的方法是改变制作标签文本变量,然后检查len(txt1)对len(txt2),并将两者的宽度变量设置为最长一。以下代码已结束。我的知识太有限,无法确定额外空间的来源。

    txt1 = StringVar()
    txt2 = StringVar()
    lblWidth = IntVar()
    txt1 = "Hi"
    txt2 = "Longer label, shorter box"

    if (len(txt1) > len(txt2)):
        lblWidth = len(txt1)
    else:
        lblWidth = len(txt2)

    Label(win, text=txt1, width=lblWidth, anchor=W).grid(in_=frame_a)
    Label(win, text=txt2, width=lblWidth, anchor=W).grid(in_=frame_b, sticky=W)