在Python Tkinter中使用网格布局来拉伸框架

5

我正在尝试使用Python 2.6.7和Tkinter进行伸展操作。我期望下面的代码将第一个按钮拉伸到与第二个相同的宽度,但两个按钮的宽度都只能适合其文本。

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

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

inner_a = Frame(win)
inner_a.grid(row=0, column=0, sticky=N+E+W)
inner_b = Frame(win)
inner_b.grid(row=1, column=0, sticky=S+E+W)

Button(inner_a, text='1').grid(row=0, column=0, sticky=E+W)
Button(inner_b, text='Some long text').grid(row=0, column=0, sticky=E+W)

win.mainloop()

根据我的理解,在win中的单个列会扩展到它包含的最大内容的宽度,即inner_b的宽度,然后是inner_a的宽度,接着第一个按钮的宽度就等于第二个按钮的宽度。
实际上发生的是以下情况:第一个按钮仅足够宽以包含“1”,而不是像第二个按钮一样宽。
我需要怎么做才能使第一个按钮扩展为第二个按钮的大小?
1个回答

9
如果您想让小部件在网格中对齐,首先要确保它们具有相同的父级。如果所有小部件都是相同大小或仅使用一列,则不是必需的。
另一件事是给您的列分配一个权重。在您的代码中发生的情况是小部件正在扩展以填充该列,但该列未扩展以填充主控件。如果您将其权重设置为1,它就会这样做。您需要执行类似于“inner_a.columnconfigure(1, weight=1)”的操作,然后也要对“inner_b”执行相同的操作。

1
给小部件分配相同的直接父级不是一个选择;这只是真正问题的最简示例,其中将相关小部件作为直接子代确实不可选。修复了权重(对于列“0”,而不是您答案中的“1”)解决了它,谢谢! - me_and
2
@me_and:你知道吗?你可以将小部件放置在与其父容器不同的容器中。这是一种非常有价值的技术。在网格、包装和放置命令中,有一个“in_”选项可以实现这一点。 - Bryan Oakley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接