2012-03-15 38 views
3

我想要延伸到使用Python 2.6.7和Tkinter一起工作。我期望下面的代码将第一个按钮拉伸到第二个按钮的宽度,但是这两个按钮的宽度只有它们需要适合的文本宽度。在Python中使用网格布局来拉伸框架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”,不如第二个按钮宽。

Screen shot: two buttons stacked on top of each other, the first has the single character "1", the second the words "Some long text". The bottom button is considerably wider than the top.

什么我需要做的就是第一个按钮,展开第二的大小?

回答

8

如果您希望小部件排列在网格中,首先要做的是确保它们具有相同的父级。如果所有小部件的大小相同,或者您只使用一列,则这不是必需的。

你需要做的另一件事是给你的专栏权重。你的代码中发生的事情是,小部件扩展到填充列,但该列未扩展以填充主控。如果你给它1的重量,它会的。你需要做一些类似于inner_a.columnconfigure(1, weight=1)的事情,然后再做inner_b

+1

为小部件提供相同的直接父项不是一种选择;这是真正问题的最小例子,将相关小部件作为直接孩子确实不是一种选择。尽管如此,修复重量(对于列'0',而不是在你的答案中的'1'),但是,谢谢! – 2012-03-16 16:44:14

+2

@me_and:您是否知道您可以将小部件放在与父项不同的容器中?这是一个非常有价值的技术。网格有一个'in_'选项,打包和放置命令来做到这一点。 – 2012-03-17 01:38:39

+0

感谢您的回答:D – holmeswatson 2014-04-27 17:10:11