gpt4 book ai didi

python - 如何对包含两个 ttk Treeviews 的 ttk Notebook 进行网格化,以便它扩展以填充其指定的网格单元?

转载 作者:太空宇宙 更新时间:2023-11-03 14:09:20 28 4
gpt4 key购买 nike

我在使用 ttk.Notebookgrid 布局管理器布局两个相同的 ttk.Treeview 小部件时遇到问题。当我仅使用一个 TreeView (放置在标签框架中、放置在框架(部分)中、放置在另一个框架()中时,放置在 root 中),然后一切正常,我得到了想要的结果:

enter image description here

但是一旦我尝试将两个这样的 TreeView 放入笔记本中,一切都会变得困惑,即使我除了添加之外没有更改代码中的任何内容笔记本:

enter image description here

这是我根据the SO guidelines准备的代码为了更好地说明问题(我试图使其尽可能短,同时保留从中取出的应用程序的重要特征(如列布局和滚动条)):

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("App")

mainframe = ttk.Frame(root)
mainframe.grid()
section = ttk.Frame(mainframe, padding=(0, 0, 10, 60))
section.grid(sticky="nsew")
labelframe = ttk.Labelframe(section, text="Title", padding=(5, 7, 5, 13))
labelframe.grid(sticky="nsew")

# styles
style = ttk.Style()
style.configure(
"App.Treeview",
font=("TkDefaultFont", 8),
rowheight=15
)
style.configure(
"App.Treeview.Heading",
font=("TkDefaultFont", 8)
)


def build_tree(parent):

# treeview
trv = ttk.Treeview(parent)
trv.configure(
style="App.Treeview",
height=19,
columns=("#1", "#2", "#3", "#4"),
displaycolumns="#all",
selectmode="browse"
)
trv.grid(column=0, row=0, sticky="nsew")

# treeview's scrollbars
sbar_vertical = ttk.Scrollbar(parent, orient=tk.VERTICAL, command=trv.yview)
sbar_vertical.grid(column=1, row=0, sticky="ns")
sbar_horizontal = ttk.Scrollbar(parent, orient=tk.HORIZONTAL, command=trv.xview)
sbar_horizontal.grid(column=0, row=1, sticky="we")
trv.configure(yscrollcommand=sbar_vertical.set, xscrollcommand=sbar_horizontal.set)

# treeview's columns
trv.heading("#1", text="Name_1")
trv.heading("#2", text="Pos")
trv.heading("#3", text="NT/R")
trv.heading("#4", text="★")
trv.column("#0", stretch=True, minwidth=70, width=49)
trv.column("#1", stretch=True, minwidth=97, width=49)
trv.column("#2", stretch=True, minwidth=35, width=49)
trv.column("#3", stretch=True, minwidth=40, width=49, anchor=tk.E)
trv.column("#4", stretch=True, minwidth=12, width=49)

return trv


# tree = build_tree(labelframe)

# notebook
notebook = ttk.Notebook(labelframe)
tree1 = build_tree(notebook)
tree2 = build_tree(notebook)
notebook.add(tree1, text="One")
notebook.add(tree2, text="Two")
notebook.grid(sticky="nsew")

root.resizable(False, False)
root.mainloop()

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

# tree = build_tree(labelframe)

划行并注释掉#notebook部分。

我尝试在构造函数中提供笔记本 heightweight 选项参数,但没有任何改变,并且还尝试添加

rowconfigure(0, weight=1)
columnconfigure(0, weight=1)

到每个级别的容器(mainframesectionlabelframe),甚至全部到笔记本和 TreeView (即使据我所知,只有当窗口可调整大小时才需要这样做) - 获得完全相同的结果。

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

我的环境:Ubuntu 17.10、Python 3.6.3、Tkinter 8.6。如果 TreeView 列的设置看起来有些奇怪 - 它源自 a comment to this question并且必须像这样才能使用水平滚动条。

最佳答案

问题是您尝试使用 grid 将滚动条和 TreeView 添加到笔记本,然后还使用笔记本的 add 方法添加它们。你不能将两者混为一谈。创建笔记本时,不应通过 packplacegrid 直接向其中添加小部件。

相反,每个笔记本选项卡应该是一个框架。然后,您可以使用 packplacegrid 将任何其他小部件放入该框架内。然后,您可以使用 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)
...

现在,这将使笔记本的外观和行为与笔记本相关。

您与所有其他框架都存在类似的行/列权重问题,因此您需要将权重应用于每个具有由网格管理的子小部件的小部件。

关于python - 如何对包含两个 ttk Treeviews 的 ttk Notebook 进行网格化,以便它扩展以填充其指定的网格单元?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48633394/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com