TKinter - 使用网格布局在窗体中“粘贴”的小部件

时间:2012-11-15 16:56:10

标签: python tkinter

我正在TKinter中构建一个相当复杂的GUI,所以很自然地使用了.grid函数。

我已经将我的一些小部件组合到框架中以使它们更容易处理,但出于某种原因,当我在框架中使用带有小部件的.grid时,粘性属性似乎不起作用 - 我的小部件不填充整个框架。

示例:

f3 = tk.Frame(self, borderwidth=1, relief="ridge")
f3.grid(row=0, column=0, sticky="NS")
tk.Label(f3, text="Site List").grid(in_=f3, row=0, column=0)
self.sitelist = tk.Listbox(f3)
self.sitelist.grid(in_=f3, row=1, column=0, sticky="NS")

在上面的代码中,框架f3填充了我的根窗口小部件的0,0单元格中的空间,但是列表框没有填充框架中的所有空间,即使我已经要求它粘“NS”。

如果将列表框放在根小部件中的0,0那么它会拉伸并填充所有空格。如果它在框架内,它表现不佳。

任何人都可以解释如何解决这个问题吗?

我认为使用框架会简化我的布局,但它不是!!!

干杯。 克里斯

2 个答案:

答案 0 :(得分:5)

您需要提供一个或多个列和行“weight”。通常,您将只有一行和一列,权重为1(默认值为零)。当调整包含小部件或窗口的大小时,任何具有权重的行或列都将展开和收缩。

如果多个行或多个列具有权重,则权重描述它们扩展的比例。例如,如果一列的权重为2而另一列的权重为1,那么两列的权重将扩大为1的权重。

您可以使用grid_rowconfiguregrid_columnconfigure选项为包含小部件指定权重:

f3.grid_rowconfigure(0, weight=1)
f3.grid_columnconfigure(0, weight=1)

有关权重的简短描述,请参阅Handling Resize网站上网格教程中标题为tkdocs.com的部分。

答案 1 :(得分:1)

首先,在实例化时,不应该同时对标签进行网格化。然后,您必须使用Grid.rowconfigure向行添加“权重”,并使用Grid.columnconfigure将其添加到列中。权重控制扩展,并且必须为非零,以允许网格扩展小部件。 如果您在代码中添加以下行,它应该可以工作:

Grid.columnconfigure(f3, 0, weight=1)
Grid.rowconfigure(f3, 0, weight=1)
Grid.rowconfigure(f3, 1, weight=1)

希望有所帮助