【发布时间】:2019-05-02 05:03:52
【问题描述】:
我想消除奇怪的额外空间,当单独使用grid() 时,我的布局中似乎无法调整任何大小,但调用pack() 有时会使事情变得更糟:GUI 完全消失了!
我从@Bryan Oakley 那里读到了一些令人大开眼界的布局答案,例如:
When to use pack or grid layouts in tkinter?
和
Tkinter: grid or pack inside a grid?
但是当我开始写自己的东西时,我仍然经常遇到麻烦。
我的理解:
- 我必须有一个框架来填充
root window,否则没有希望填充窗口中的额外空间,但是我单独调整小部件。 - 对于位于共同父级
Frame内的所有子小部件,我必须使用pack()或grid(),但不能同时使用两者。 - 在框架中使用
grid()时,必须使用非零weight参数指定Frame.grid_rowconfigure()和.grid_columnconfigure()。否则,什么都不会显示。 - 因此可以让主
Frame使用pack(),但它的直接子Frames都使用grid();在网格上的每个子Frames中,我们可以pack()他们自己的子小部件。换句话说,我们可以通过“区域”或容器层次结构级别将grid()和pack()交错,但绝不要将它们混合在同一个容器中:唯一的限制。 - 通过仔细的权重设计,我可以在父级
Frame中填充一个水平空间,其中一个子级Frame充满水平布局的小部件,例如,所有小部件都使用grid(sticky='nsew'),而子级Frame使用pack(side='top', fill='both', expand=True)。
如果我的理解是正确的,那么我永远无法弄清楚为什么 #5 不能为我工作,例如,在我的水平孩子 Frame 的右端总是有未使用的额外空间在主 Frame 内根窗口。
更新 2
我想通了。 #5 对我不起作用,因为我在使用 grid() 之前忘记在主 Frame 中指定 .grid_columnconfigure(0, weight=1)。我的错!结案。
更新
我在 macOS High Sierra 上,运行 python 3.6.4 Homebrew。
【问题讨论】:
-
好吧,#1 是错误的 - 您可以在该框架中执行的任何操作都可以直接在根窗口中轻松完成。调试提示:(暂时)给你的框架一个不同的边框和/或背景颜色,这样你就可以准确地看到它们的范围是什么。让小部件占用空间的问题实际上通常是封闭框架不占用空间的问题。
-
@jasonharper 是的,我总是给我的框架上色,并在有/没有框架的情况下搞乱。也许是 macOS。
-
@kakyo: 不,
pack和grid在 tkinter 支持的所有平台上行为相同。