Python 如何对包含两个ttk TreeView的ttk笔记本进行网格化,使其扩展以填充指定的网格单元?

Python 如何对包含两个ttk TreeView的ttk笔记本进行网格化,使其扩展以填充指定的网格单元?,python,tkinter,treeview,grid-layout,Python,Tkinter,Treeview,Grid Layout,我在使用ttk.Notebook和grid布局管理器布局两个相同的ttk.Treeview小部件时遇到问题。当我只使用一个treeview(放置在labelframe中,放置在frame(节)中,放置在另一个frame(main)中,放置在root中)时,一切都正常工作,我得到了期望的结果: 但当我尝试在笔记本中放入两个这样的树视图时,一切都乱七八糟了,尽管除了添加笔记本外,我没有更改代码中的任何内容: trv = ttk.Treeview(frame) sbar_vertical = ttk

我在使用
ttk.Notebook
grid
布局管理器布局两个相同的
ttk.Treeview
小部件时遇到问题。当我只使用一个treeview(放置在labelframe中,放置在frame(节)中,放置在另一个frame(main)中,放置在root中)时,一切都正常工作,我得到了期望的结果:

但当我尝试在笔记本中放入两个这样的树视图时,一切都乱七八糟了,尽管除了添加笔记本外,我没有更改代码中的任何内容:

trv = ttk.Treeview(frame)
sbar_vertical = ttk.Scrollbar(frame, ...)
sbar_horizontal = ttk.Scrollbar(frame, ...)

以下是我为更好地说明这个问题而编写的代码(我试图使它尽可能简短,同时保留它被删除的应用程序的重要特征(如列布局和滚动条):

要在第一个结果和第二个结果之间切换,只需取消注释

# tree = build_tree(labelframe)
#笔记本
部分划线并注释掉

我尝试在构造函数中为notebook
height
weight
选项提供参数,但没有任何更改,还尝试添加

rowconfigure(0, weight=1)
columnconfigure(0, weight=1)
到每一层的容器(
大型机
部分
labelframe
),甚至到笔记本和TreeView(即使这样,只有当窗口要调整大小时才有必要),获得完全相同的结果

我的理解是,如果小部件被放置在
网格中
而没有任何选项传递给
网格()
调用,那么放置的小部件决定它需要多少空间,
网格
管理器将给定列的宽度(或行的高度)调整为小部件请求的最高值(在给定的列或行中管理的所有内容)。然后,如果这样决定的空间对于使用相同行/列的其他小部件来说太大,那么它就会被拉伸(或者没有-主要根据
粘性
选项).如果这种理解是正确的,那么我就不太理解笔记本的行为,特别是当单独的树状视图似乎完全遵守它时

我的环境:Ubuntu 17.10、Python 3.6.3、Tkinter 8.6。
如果treeview列的设置看起来有点奇怪-它是从水平滚动条中派生出来的,并且必须是这样才能使用水平滚动条。

问题是,您试图使用
网格
将滚动条和treeview添加到笔记本中,然后还使用笔记本的
添加
方法添加它们。您无法不要将两者混用。创建笔记本时,不应通过
pack
place
grid
直接向其添加小部件

相反,每个笔记本选项卡应该是一个框架。然后,您可以使用
pack
place
grid
将任何其他小部件放入该框架中。然后,您可以使用
add
将此框架添加到笔记本中

因此,您的第一步是修改
build_tree
以创建并返回帧:

def build_tree(parent):
    frame = ttk.Frame(frame)
    ...
    return frame
接下来,您需要确保树和滚动条是此框架的子项,而不是笔记本的子项:

trv = ttk.Treeview(frame)
sbar_vertical = ttk.Scrollbar(frame, ...)
sbar_horizontal = ttk.Scrollbar(frame, ...)
根据经验,无论何时使用
网格
时,应始终为至少一行和一列指定非零权重,以便它们增长和收缩以填充任何额外空间。因此,请确保设置了此框架的行和列的权重

例如:

def build_tree(parent):
    ...
    frame.grid_rowconfigure(0, weight=1)
    frame.grid_columnconfigure(0, weight=1)
    ...
现在,这将使笔记本的外观和行为相对于笔记本而言正常


您在所有其他框架中都遇到了类似的行/列权重问题,因此您需要将权重应用到每个小部件,这些小部件都有由
网格管理的子小部件。非常感谢。我很高兴有了一个可行的解决方案,但也很高兴我的问题值得您回答。现在我记得有一个偶然的预感,它是c我可能会添加一个额外的框架,但我想我下意识很不喜欢它,因为我的设置已经有6个嵌套级别。只有一个额外的澄清:你应该始终给至少一行和一列非零权重,以便它们增长和收缩以填充任何额外的空间-即使root设置为
可调整大小(False,False)
?我认为只有当给定的行/列因用户而增大时才需要它,不?@o'rety-将窗口设置为不可调整大小,并且行和列的权重基本上是不相关的。如果您有一个大窗口和小部件(无论窗口是否可调整大小),列权重可以帮助tkinter知道如何在另外,从可用性的角度来看,你几乎不应该限制用户调整窗口大小的能力。他们比你更了解窗口的大小。