在什么情况下Tkinter的grid()无法与pack()混合?

时间:2018-11-30 03:24:56

标签: python tkinter

我想消除奇怪的多余空间,当单独使用grid()时似乎无法抵抗布局中的任何尺寸调整,但是有时调用pack()会使情况变得更糟:GUI完全消失了! >

我从@Bryan Oakley阅读了一些令人大开眼界的布局答案,例如:

When to use pack or grid layouts in tkinter?

Tkinter: grid or pack inside a grid?

但是当我开始写自己的东西时,我仍然经常遇到麻烦。

我的理解:

  1. 我必须有一个框架来填充root window,否则就没有希望填充窗口中的多余空间,但是我会单独调整小部件。
  2. 对于位于同一个父项Frame中的所有子级小部件,我必须使用pack()grid(),但不能同时使用。
  3. 在框架中使用grid()时,必须用非零的Frame.grid_rowconfigure()参数指定.grid_columnconfigure()weight。否则,什么都不会出现。
  4. 因此可以将主Frame使用pack(),但将其直接子级Frames都使用grid();在网格中的每个子Frames内,我们可以pack()自己的子窗口小部件。换句话说,我们可以按“区域”或容器层次结构级别来交错grid()pack(),但切勿将它们混入同一容器中:唯一的限制。
  5. 通过仔细的权重设计,我可以在子Frame的父Frame的水平空间中填充水平放置的小部件,例如,所有小部件都使用grid(sticky='nsew'),并且子Frame使用pack(side='top', fill='both', expand=True)

如果我的理解是正确的,那么我永远无法弄清楚为什么#5不能为我工作,例如,在主{内,我的水平孩子Frame的右端总是有未使用的多余空间根窗口的{1}}。

更新2

我知道了。 #5对我不起作用,因为在使用Frame之前我忘记在主.grid_columnconfigure(0, weight=1)中指定Frame。我的错!结案了。

更新

我在macOS High Sierra上,运行python 3.6.4 Homebrew。

1 个答案:

答案 0 :(得分:3)

  

在什么情况下Tkinter的grid()无法与pack()混合?

在所有情况下,对于具有共同母版的窗口小部件,不能同时使用gridpack。在母版中,所有直接子代必须使用相同的几何图形管理器。在整个应用程序中,您可以将packgrid混合在一起,只要遵循一条规则,即您不能将它们都用于具有相同父级的小部件,就可以将它们混合使用。

  
      
  1. 我必须有一个框架来填充根窗口,否则就没有希望填充窗口中的多余空间,但是我会单独调整小部件。
  2.   

这是不正确的。您无需使用框架即可轻松填充根窗口中的所有空间。

  
      
  1. 对于位于公共父框架内的所有子小部件,我必须使用pack()或grid(),但不能同时使用。
  2.   

是正确的。第三种选择是使用place,尽管它很少是最佳选择。

  
      
  1. 在框架中使用grid()时,必须使用非零权重参数指定Frame.grid_rowconfigure()和.grid_columnconfigure()。否则,什么都不会出现。
  2.   

那是不正确的-配置行和列的权重为非零不是强制性的。通常,这是最佳做法,但并不需要显示小部件。权重仅适用于grid如何管理额外空间。无论是否使用权重,任何大小不为零的小部件都应显示。

  
      
  1. 因此可以使用pack()来拥有主Frame,但是其直接子Frame都可以使用grid()
  2.   

正确。

  
      
  1. 通过仔细的权重设计,我可以在父框架的水平空间中填充一个子框架,该子框架充满了水平放置的小部件,例如,所有小部件都使用grid(sticky ='nsew'),而子框架使用pack (side =“ top”,fill =“ both”,expand = True)。
  2.   

是的。