Tkinter:无法用小部件填充整个框架

Tkinter: trouble filling entire frame with widget

我正在尝试创建三个框架:顶部、中间和底部。我成功地将小部件添加到我的顶部和底部框架,并按照我的需要将它们定向。

但是,我只是想在中间框架中添加两个条目小部件,它们将跨越 frame/window 的整个宽度。

由于顶部和底部框架中所有小部件的代码长度,我将包含一段代码来说明如何配置我的 window 和框架:

root = Tk()
root.resizable(False, False)

top_frame = Frame(root)
middle_frame = Frame(root)
bottom_frame = Frame(root)

# I think this block is irrelavant to the question, but including it anyway just incase
rows = 0
while rows < 36:
    top_frame.rowconfigure(rows, weight=1)
    top_frame.columnconfigure(rows, weight=1)
    bottom_frame.rowconfigure(rows, weight=1)
    bottom_frame.columnconfigure(rows, weight=1)
    rows += 1

top_frame.grid(row=0, column=0)
middle_frame.grid(row=1, column=0)
bottom_frame.grid(row=2, column=0)

这是我用于两个条目小部件的代码:

entry_1 = Entry(middle_frame)
entry_2 = Entry(middle_frame)
entry_1.grid(row=0, column=0, sticky=E+W)
entry_2.grid(row=1, column=0, sticky=E+W)

但是,它们只是粘在中框的中央。我尝试了很多解决方案,但似乎没有什么能改变这些条目小部件在框架内的外观——始终居中,从不改变大小。我什至尝试只打包它们并将它们的填充设置为 X。我可能忽略了一些非常简单的东西,但我不太明白。

Here is a picture for reference

问题的根源是中间框架没有配置为填满 window 的整个宽度,所以里面的小部件不会填满 window 的整个宽度.

第一步是使用中间的sticky选项window:

middle_frame.grid(row=1, column=0, sticky="ew")

接下来,您还没有告诉 grid 如何处理根 window 中的额外 space。根据经验,任何使用 grid 管理其子项的小部件都应至少有一行和一列的权重大于零。

要使中间框架占据 window 的整个宽度,请为其所在的列赋予非零权重:

root.grid_columnconfigure(0, weight=1)

中间框架中存在同样的问题:您没有指示 grid 如何处理额外的 space。根据经验,我们需要在中间框架内给零列一个权重:

middle_frame.grid_columnconfigure(0, weight=1)

这将允许中间框架中的条目小部件填充中间框架,我们已经配置了应用程序,以便中间框架填充 window 的整个宽度。