为什么 tkinter.grid() 方法中的 'ipady' 选项只在小部件下面添加 space?

Why does the 'ipady' option in the tkinter.grid() method only add space below a widget?

下面是显示问题的代码。 Label1 表明我需要使用 padyLabel1 位移 10 个像素。 Label2显示ipady的默认效果。为什么 ipady 不在小部件上方和下方留下 space?我如何使用 padyipady 做它应该做的事情 w/o?谢谢。

引用 tcl documentation:

-ipady amount

The amount specifies how much vertical internal padding to leave on the top and bottom of the slave(s). This space is added inside the slave(s) border. The amount defaults to 0.

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()

s = ttk.Style()
s.configure('one.TFrame', background='light blue', relief='raised',borderwidth=10)
s.configure('two.TFrame', background='light green', relief='sunken', borderwidth=10)

frame1 = ttk.Frame(root,style='one.TFrame')
frame1.grid(row=0, column=0, sticky='nsew', ipady=10,)

label1 = ttk.Label(frame1, text='Label1')
label1.grid(sticky='nsew',padx=10, pady=10,)

frame2 = ttk.Frame(frame1,style='two.TFrame')
frame2.grid(row=1, column=1, sticky='nsew', ipady=50,)

label2 = ttk.Label(frame2, text='Label2')
label2.grid()

我不认为 ipady 完全符合您的想法。不可否认,文档在这一点上有点不清楚。它不会添加相当于内部边距的内容。相反,它只是将那么多像素添加到小部件的高度,并且这些像素被添加到边框的内侧而不是外侧。它不会 "block off" 这些像素被使用。

如果您的框架通常为 20 像素高,使用 ipady=50,您的小部件现在将为 120 像素高 (50*2 + 20)。添加到此框架内的任何小部件都能够使用框架内的所有 space。因此,当您使用 grid 在第 0 行放置某些内容时,它仍会出现在框架的最顶部,恰好在边框下方。

这正是我在您的代码中看到的。在我的机器上,没有 ipady=50 的 frame2 最终是 20 像素高。当我添加 ipady=50 时,框架变为 120 像素高。标签出现在框架的最顶部,因为它已被放置在第 0 行。

TL;DR:不要认为 ipady 是在说 "I need this much of an inside margin",而是 "I need this much more extra space inside"。