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

问题描述 投票:1回答:1

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

_tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid
python tkinter tk
1个回答
0
投票

原因是每个人都希望控制给定容器(框架,顶层等)内所有小部件的几何形状,并且每个人在检测到所控制的小部件更改大小时将重新应用其规则。

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

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

接下来,因为pack正在管理某些小部件,所以当它检测到窗口大小已更改时,它将重新应用自己的算法,可能会更改某些小部件的大小或位置。

接下来,由于某些小部件由网格管理,它将检测到它们的大小已更改,并且将尝试重新应用其算法。这可能会导致窗口增大或缩小,或更改某些小部件的大小。

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

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

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

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

实际上,如果您非常小心并且确切知道会发生什么情况,则可以将两个都用于共享同一父对象的小部件,但是我从来没有遇到过这样做的正当理由。 您也绝对可以(和

应该

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

© www.soinside.com 2019 - 2024. All rights reserved.