Tkinter 包布局:松紧带类比

Tkinter pack layout: Elastic band analogy

我对使用 pack 的描述就像将所有小部件放在一个松紧带中,这意味着 pack 会尽量将您的小部件放在一个小而整洁的区域。

这个类比与事实的接近程度,有什么不一致之处?

这个类比一点也不准确。 pack 不会试图把东西放在 "small, neat area" 里,它真的和松紧带没有任何关系。

pack 在概念上非常简单:它将小部件围绕父小部件中未分配的 space 的边缘排列。想到这一点的最简单方法是,您从外面填充一个盒子,然后自己向中间移动。使用 pack,您不断地填充一个空腔,这就是为什么这被称为 腔模型

当您将小部件放置在父小部件的空腔内时,您是将它放置在空腔的一侧。然后小部件占据了那个空腔的整个侧面。例如,如果你用 side="left" 选项打包一些东西,这个小部件将占据整个空腔的左侧,然后为下一个小部件缩小空腔的大小。如果父控件的宽度为 1000 像素,而子控件的宽度为 100 像素,那么您将为下一个子控件将空腔缩小到 900 像素宽。

关于 pack 工作原理的最佳和最完整的描述可以在书 Practical Programming in Tcl and Tk, by Brent Welch, Ken Jones, and Jeffrey Hobbs. A concise but complete description of the packer algorithm can be found in the tcl/tk pack man page 中找到。它是从 tcl/tk 程序的角度(相对于 python/tkinter)编写的,但无论您使用哪种语言,基本方面都是相同的。