当前的答案通过使用padding
关键字参数提供了一种解决方法。仍然需要解释为什么使用ipadx
失败。
MCVE
import Tkinter as tk
import ttk
root = tk.Tk()
root.minsize(200, 100)
inner_frame = ttk.LabelFrame(root, text='inner_frame')
inner_frame.grid(row=0, column=0)
button = ttk.Button(inner_frame, text='this is a button')
button.grid(row=0, column=0)
# this does not work as expected
inner_frame.grid_configure(ipadx=20)
root.mainloop()
输出量
题
为什么
inner_frame
的内部填充仅在右侧应用?如何在两面都使用? 最佳答案
就您而言,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
对应用于ipadx
的inner_frame
值一无所知-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像素小部件,应该位于按钮的左边缘。这就是原始框架和按钮所发生的事情-按钮被添加到框架内部,从而利用框架内部的所有空间。