为什么不能在同一代码中使用函数 'pack' 和 'grid

Why can't you use the function 'pack' and the 'grid in the same code

我知道您不能同时使用 packgrid,但为什么呢?为什么会引发错误?

_tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid

原因是每个人都想控制给定容器(Frame、Toplevel 等)内所有小部件的几何形状,并且每个人都会在检测到它正在控制的小部件改变大小时重新应用其规则。

例如,如果您从使用 pack 开始,pack 会根据自己的算法将小部件添加到 window。根据小部件的大小和方向,这可能会导致 window 增大或缩小,并可能导致具有相同母版的其他小部件增大或缩小。

现在,如果您使用 grid 添加小部件,它会做同样的事情——它将使用自己的算法添加小部件。与 pack 一样,这可能会导致 window 增大或缩小,或者小部件改变大小。

接下来,由于pack正在管理一些小部件,当它检测到window改变了尺寸时,它会重新应用自己的算法,可能会改变一些小部件的尺寸或位置。

接下来,因为一些小部件是由网格管理的,所以它会检测到它们的大小发生了变化,并且会尝试重新应用其算法。这可能会导致 window 增大或缩小,或更改某些小部件的大小。

接下来,由于一些小部件由 pack 管理,它将检测到它们的大小已更改,因此它将尝试重新应用其算法。这可能会导致 window 增大或缩小,或更改某些小部件的大小。

接下来,由于一些小部件由网格管理,它将检测到它们的大小发生了变化,因此它将尝试重新应用其算法。这可能会导致 window 增大或缩小,或更改某些小部件的大小。

接下来,由于一些小部件由 pack 管理,它将检测到它们的大小已更改,因此它将尝试重新应用其算法。这可能会导致 window 增大或缩小,或更改某些小部件的大小。

...依此类推,直到时间结束,或直到某些原因导致此循环结束。

实际上 如果您非常小心并且确切地知道会发生什么,则可以将两者用于共享一个公共父级的小部件,但我从来没有遇到过有效的这样做的理由。

您也绝对可以(并且应该)在整个应用程序中同时使用 pack 和 grid。两者都有优点和缺点。例如,您可以使用 pack 为应用程序的其余部分添加全宽工具栏、全宽状态栏和中间部分。如果应用程序的其余部分是表单,则在 GUI 的中间部分为小部件使用网格可能是有意义的。