tkinter树视图缩进

2024-09-30 22:21:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在应用程序中构建一个树结构(参见下面的图片链接),并希望调整树中子级的缩进。我使用了style.configure来设置缩进级别(参见下面的代码示例)。但这似乎只控制父级下第一个子级的缩进。我想将所有子级别的缩进设置为相同

下面是我正在使用的代码片段。它显示了样式配置和图像中显示的第一个选项卡的定义:

style = ttk.Style()
style.configure("Mystyle.Treeview",  indent=15,  font=(self.tree_font, self.tree_font_size, 'normal') )
style.layout("Mystyle.Treeview", [('Mystyle.Treeview.treearea', {'sticky': 'nswe'})])  # Remove the borders


self.NBframe = Frame(self.navFrame, width=tree_display_width)
self.NBframe.pack(expand = TRUE, fill=Y)
self.NBframe_h_scrollbar = Scrollbar(self.NBframe, orient='horizontal')
self.NBframe_h_scrollbar.pack(side=BOTTOM, fill=X)
self.NBframe_v_scrollbar = Scrollbar(self.NBframe, orient='vertical')
self.NBframe_v_scrollbar.pack(side=RIGHT, fill=Y)
self.navControl = ttk.Notebook(self.NBframe, width=tree_display_width)
self.navControl.pack(expand = TRUE, fill=Y)
self.navControl.bind('<Button-1>', self._on_navControl_click)

self.tabVendors = Frame(self.navControl, background="white", borderwidth=1, relief=RAISED, width=tree_display_width)
self.tabVendors.pack()
self.Vendors_tab_name = "Vendors"
self.navControl.add(self.tabVendors, text=self.Vendors_tab_name)
self.Vendors_tab_index = self.navControl.index(self.tabVendors)
self.tabVendors_tree = ttk.Treeview(self.tabVendors,  style="Mystyle.Treeview",show="tree",selectmode = "extended")
self.tabVendors_tree.column("#0", minwidth=tree_scroll_width, stretch=YES)
self.tabVendors_tree.pack(side=TOP, anchor=NW, expand=YES,fill=BOTH)

以下是生成的树的屏幕截图:

screenshot of tree structure

在本例中,我可以使用style.configure控制“ACTION SOFTWARE”和“AMERICAN SOFT.”的缩进。但我似乎无法改变这些条目下面的子项缩进

更新:我注意到更改indent=确实会更改较低级别的子级缩进。例如,如果我设置indent=75,则较低级别的子级将缩进。但对于较低级别的儿童,似乎有一个最小缩进数。如果我设置了indent=0,那么第二级的子项在父项下排列,但是较低级别的子项仍然缩进(在父项的第一个字符下排列)

我想知道这是否与较低级别的孩子没有打开/关闭indicator有关

下面是一段代码片段,可用于测试此场景

from tkinter import ttk
from tkinter import *

win = Tk()

windowFrame = Frame(win, relief=RIDGE)
windowFrame.pack(side=TOP, fill=BOTH, expand=YES)

tabbed_Frame = Frame(windowFrame)
tabbed_Frame.pack(side=TOP,fill=BOTH, expand=YES )
navFrame = Frame(tabbed_Frame, padx=4, pady=4, borderwidth=1, relief=SUNKEN)
navFrame.pack(side=LEFT, fill=BOTH)
dbLabel = Label(navFrame)
dbLabel.pack(side=TOP, pady=2,anchor=W)
dbLabel["text"] = "Active database:"
dbSelect = ttk.Combobox(navFrame, width=37,
                    values=["TEST.QDB"])
dbSelect.pack(side=TOP, pady=2,anchor=W)

style = ttk.Style()
style.configure("Mystyle.Treeview",  indent=15 , bd=0)
style.layout("Mystyle.Treeview", [('Mystyle.Treeview.treearea', {'sticky': 'nswe'})]) # Remove the borders

tree_width=500
NBframe = Frame(navFrame)
NBframe.pack(expand = TRUE, fill=Y)

NBframe_h_scrollbar = Scrollbar(NBframe, orient='horizontal')
NBframe_h_scrollbar.pack(side=BOTTOM, fill=X)
NBframe_v_scrollbar = Scrollbar(NBframe, orient='vertical')
NBframe_v_scrollbar.pack(side=RIGHT, fill=Y)

navControl = ttk.Notebook(NBframe)
navControl.pack(expand = TRUE, fill=Y)
tabVendors = Frame(navControl, background="white", borderwidth=1, relief=None, width=250)
tabVendors.pack()
Vendors_tab_name = "Vendors"
navControl.add(tabVendors, text=Vendors_tab_name)
Vendors_tab_index = navControl.index(tabVendors)
tabVendors_tree = ttk.Treeview(tabVendors,show="tree",style="Mystyle.Treeview", selectmode = "extended")
tabVendors_tree.column("#0", minwidth=tree_width, stretch=YES)
tabVendors_tree.pack(side=TOP, anchor=NW, expand=YES,fill=Y)

NBframe_v_scrollbar.config(command=tabVendors_tree.yview)
NBframe_h_scrollbar.config(command=tabVendors_tree.xview)

tabVendors_tree.config(yscrollcommand = NBframe_v_scrollbar.set)
tabVendors_tree.config(xscrollcommand = NBframe_h_scrollbar.set)

tabProducts = Frame(navControl,background="white",borderwidth=1,relief=RAISED, width=230)
tabProducts.pack()
Products_tab_name = "Products"
navControl.add(tabProducts, text = Products_tab_name)
Products_tab_index = navControl.index(tabProducts)
tabProducts_tree = ttk.Treeview(tabProducts, style="Mystyle.Treeview", show="tree",selectmode = "extended",  yscrollcommand = NBframe_v_scrollbar.set)
tabProducts_tree.column("#0", minwidth=tree_width, stretch=YES)
tabProducts_tree.pack(side=TOP, anchor=NW, expand=YES, fill=Y)

tabVendors_tree.insert("", "end", "Level1", text="Level-1")
index=0
for i in range(0, 5):

    tree_item=tabVendors_tree.insert("Level1", "end", index, text = "Level-2-"+str(i))
    index+=1
    for j in range (0,20):

        tabVendors_tree.insert(tree_item, "end", index, text="Level-2-"+ str(i) + '-' + str(j) + 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxy')
        index+=1

win.mainloop()
quit()

有没有其他我忽略的选择

更新:

下面是带有style.configure("Mystyle.Treeview", indent=15 , bd=0)的测试代码的图像。这将导致Level-2-0的打开/关闭框在其父级Level-1的“L”下对齐。我的目标是让“Level-2-0-0xxxx…”条目(突出显示)在其上方的“Level-2-0”父条目中的“L”下对齐。但是,它仍然缩进。似乎最低级别的子条目有一个最小缩进

enter image description here


Tags: selftreeindexstylewidthfillframeside