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)
在#笔记本
部分划线并注释掉
我尝试在构造函数中为notebookheight
和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知道如何在另外,从可用性的角度来看,你几乎不应该限制用户调整窗口大小的能力。他们比你更了解窗口的大小。