Treeview#

树状视图小部件展示了项目的层次结构,允许用户浏览。每个项目的一个或多个属性可以作为列显示在树的右侧。它可以用来构建类似于文件管理器中的树状显示的用户界面,比如macOS Finder或Windows Explorer。和大多数Tk小部件一样,它提供了令人难以置信的灵活性,因此可以根据各种情况进行定制。

tree = ttk.Treeview(parent)

水平滚动条和垂直滚动条可以根据需要以通常的方式添加。

向树视图中添加项目#

为了对树视图执行任何有用的操作,我们需要向其中添加一个或多个项目。每个项目代表树中的一个节点,无论是叶节点还是包含其他节点的内部节点。项目通过唯一的id引用。可以在创建项目时分配此id,或者小部件可以自动生成一个。

通过使用树视图的 insert 方法将项目插入到树中来创建项目。要插入项目,我们需要知道在哪里插入它。这意味着指定父项目以及在父项目的现有子项列表中的何处插入新项目。

树视图小部件会自动创建一个根节点(未显示)。其id为空字符串。它是添加的第一级项目的父母。节点子项列表中的位置通过索引指定(0表示第一个,end表示在所有现有子项之后插入)。

通常,您还会指定每个项目的名称,这是树中显示的文本。其他选项允许您在名称旁边添加图像,指定节点是打开还是关闭等。

# 插入到根节点,程序选择id:
tree.insert('', 'end', 'widgets', text='Widget Tour')

# 同样的事情,但作为第一个子项插入:
tree.insert('', 0, 'gallery', text='Applications')

# 树视图选择id:
id = tree.insert('', 'end', text='Tutorial')

# 在现有节点下插入:
tree.insert('widgets', 'end', text='Canvas')
tree.insert(id, 'end', text='Tree')

插入项目返回新创建项目的id

使用的例子:

图1 insert 函数的使用范例

从图1 可以看出如果指定 iid,则 insert 方法会返回 iid 名称,否则返回被自动分配的 iid 的值。

图2 树视图的例子

重新排列项目#

节点(及其后代,如果有的话)可以移动到树中的不同位置。唯一限制是节点不能移动到其后代之下,原因很明显。如前所述,目标位置通过父节点及其子项列表中的位置指定。

tree.move('widgets', 'gallery', 'end')  # 将widgets移动到gallery下

可以从树中分离项目。这会移除项目及其后代,但不销毁项目。这使我们以后可以通过move重新插入它们。

tree.detach('widgets')

也可以删除项目,这将完全销毁项目及其后代。

tree.delete('widgets')

要遍历层次结构,可以使用方法找到项目的父项(父项),下一个或上一个兄弟项(next item和prev item),并返回项目的子项列表(children item)。

我们可以通过修改open item配置选项来控制项目是否打开并显示其子项。

tree.item('widgets', open=True)
isopen = tree.item('widgets', 'open')

显示每个项目的信息#

树视图可以显示关于每个项目的一或多条附加信息。这些信息显示在主树显示的右侧列中。

每列都通过我们分配的符号名称引用。我们可以使用树视图小部件的columns配置选项指定列列表,无论是在首次创建小部件时还是在稍后。

tree = ttk.Treeview(root, columns=('size', 'modified'))
tree['columns'] = ('size', 'modified', 'owner')

我们可以指定列的宽度,如何对列中项目信息的显示进行对齐,等等。我们还可以提供有关列标题的信息,例如要显示的文本、可选图像、对齐方式以及单击项目时要调用的脚本(例如,对树进行排序)。

tree.column('size', width=100, anchor='center')
tree.heading('size', text='Size')

要在每列中为每个项目显示的内容可以单独指定,方法是使用set方法。您还可以提供一个描述所有列中要显示内容的列表。这是通过values item配置选项完成的。它接受一个值列表,可以在首次插入项目时提供,也可以稍后更改。列表的顺序必须与小部件配置选项中的列顺序相同。

tree.set('widgets', 'size', '12KB')
size = tree.set('widgets', 'size')
tree.insert('', 'end', text='Listbox', values=('15KB', 'Yesterday', 'mark'))

项目外观与事件处理#

如同文本和画布小部件,树视图(treeview)小部件也使用标签来修改树中项的外观。我们可以通过标签项配置选项给每个项分配一个标签列表(同样,在创建项时或之后进行)。

然后,可以在标签上指定配置选项,应用于所有拥有该标签的项。有效的标签选项包括前景色(文字颜色)、背景、字体和图像(如果项指定了自己的图像则不使用图像)。

我们还可以创建事件绑定到标签上来捕获鼠标点击、键盘事件等。

tree.insert('', 'end', text='button', tags=('ttk', 'simple'))
tree.tag_configure('ttk', background='yellow')
tree.tag_bind('ttk', '<1>', itemClicked)
# 被点击的项可以通过 tree.focus() 找到

树视图将生成虚拟事件 <<TreeviewSelect>>, <<TreeviewOpen>>, 和 <<TreeviewClose>>,这允许我们监控用户对小部件所做的更改。我们可以使用选择方法来确定当前选择(也可以从你的程序中改变选择)。

自定义显示#

我们可以自定义树视图小部件显示方式的许多方面。我们已经看到了一些,例如项的文本、字体和颜色、列标题的名称等等。以下是一些额外的自定义选项。

  • 使用高度小部件配置选项指定要显示的行数。

  • 通过列的宽度或最小宽度选项控制每列的宽度。持有树的列可以通过符号名称 #0 访问。整个小部件请求的宽度基于列宽的总和。

  • 使用 displaycolumns 小部件配置选项选择要显示的列及其显示顺序。

  • 你可以选择性地隐藏一个或两个列标题或树本身(仅留下列),使用 show 小部件配置选项(默认是 "tree headings" 以显示两者)。

  • 你可以通过 selectmode 小部件配置选项指定用户可以选择单个项或多个项,传递 browse(单个项)、extended(多个项,默认)或 none