我正在尝试创建一个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):
我已经使用了in_
grid()
{{1}}个参数,但没有取得很大成就,我想不出任何可以尝试的东西。
答案 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)