在您的情况下,ipadx 并没有失败。它按设计工作,只是它的工作方式不是很直观,尤其是当您将其应用于框架时。
为了更好地可视化正在发生的事情,让我们将ipadx 值应用于按钮而不是框架。这样我们就可以看到相对于按钮标签的填充。
例如,添加两个按钮而不是一个。给一个ipadx 20,给另一个ipadx 0。
button1 = ttk.Button(inner_frame, text='this is a button')
button2 = ttk.Button(inner_frame, text='this is a button')
button1.grid(row=0, column=0, ipadx=20)
button2.grid(row=1, column=0, ipadx=0)
请注意,带有ipadx=20 的按钮更宽,多余的空间位于按钮内部,而不是按钮周围的边距。
inner_frame 也发生了同样的事情:当它被添加到其父级时,额外的空间被添加到框架内,有效地使inner_frame 更宽。您看不到它,因为它已添加到框架内的空白空间中。
这是重要的部分:如果您将小部件添加到 inner_frame,grid 对应用于 inner_frame 的 ipadx 值一无所知——ipadx 选项仅适用于 inner_frame及其父级,而不是其子级。在inner_frame 中添加小部件时,grid 只知道inner_frame 是 X 像素宽。
为了说明,我们可以为按钮添加标签,类似于您的原始代码如何将按钮添加到框架中。 (注意:我们将关闭几何传播,以免按钮收缩)。
button1.grid_propagate(False)
label = ttk.Label(button1, text="x")
label.grid(row=0, column=0)
您应该会看到一个如下所示的窗口:
看看按钮最左边的“x”是怎样的?那是因为它对应用于其父级的ipadx 值一无所知。它只知道按钮是 X 像素小部件,并且它应该位于按钮的左边缘。
这就是你原来的框架和按钮发生的事情 - 按钮被添加到框架内,利用框架内的所有空间。