当前的答案通过使用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的按钮更宽,多余的空间位于按钮内部,而不是按钮周围的空白处。

python - 为什么仅在右侧应用内部填充?-LMLPHP

inner_frame也会发生同样的事情:将其添加到其父级时,会在框架内添加额外的空间,从而有效地使inner_frame变宽。您看不到它,因为它已添加到框架内已有的空白区域。

这是重要的部分:如果将窗口小部件添加到inner_frame,则grid对应用于ipadxinner_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)


您应该看到一个看起来像这样的窗口:

python - 为什么仅在右侧应用内部填充?-LMLPHP

看看按钮最左端的“ x”如何?那是因为它对应用于其父级的ipadx值一无所知。它所知道的只是该按钮是X像素小部件,应该位于按钮的左边缘。

这就是原始框架和按钮所发生的事情-按钮被添加到框架内部,从而利用框架内部的所有空间。

07-26 02:53