文章目录
- 初步
- 回调函数
- 绑定滚动条
初步
Treeview是ttk中的树形表组件,功能十分强大,非常适用于系统路径的表达。为了知道属性图到底是什么,下面先做个最简单的树形图
其代码如下
import tkinter as tk
from tkinter import ttk
dct = {
"中国" : ["北京", "台北", "香港"],
"美国" : ["纽约", "华盛顿"],
"日本" : ["东京", "大阪"]
}
win = tk.Tk() # 设置窗口大小
# 此为根节点
tree = ttk.Treeview(win, show = "tree")
for key in dct:
father = tree.insert("", 0, key, text=key)
for v in dct[key]:
tree.insert(father, 1, v,
text=v, values=(f"{key}-{v}"))
tree.pack(side=tk.LEFT, expand = True, fill = tk.BOTH)
win.mainloop()
首先,我们创建了一个字典,用于构成树形图的节点。
接下来,ttk.Treeview
生成一个树形图,这个几乎没什么问题,和tkinter其他所有组件完全一致,只是多了个"show"
,表明这是个树形图,说明Treeview这个组件或许还有其他形式。
然后,就到了唯一关键的函数insert
,其输入参数分别为父节点、所在列、节点ID,如果不输入节点ID,那么将有系统分配,这个参数并不是必须的。而后text
为其显示的名称,非常直观。最后values是一个并未体现在界面上的值,但可以调用。
回调函数
Treeview有三种基本的回调函数,分别当选择节点、打开父节点和关闭父节点时触发。仍以上述Treeview为例,其效果如下
具体修改方案为,在mainloop之前,添加如下代码
def slct(evt):
for item in tree.selection():
print(tree.item(item, "values"))
def open_(evt):
for item in tree.selection():
print(f"{item} has opened")
def close(evt):
for item in tree.selection():
print(f"{item} has closed")
tree.bind('<<TreeviewSelect>>', slct)
tree.bind('<<TreeviewOpen>>', open_)
tree.bind('<<TreeviewClose>>', close)
其中,绑定的三个函数slct, open_和close,分别对应选中节点、打开或关闭节点时触发。其函数内容则基本相同,都是打印当前选中节点的相关值,其中父节点直接输出节点的名字,子节点则输出其内部定义的values。
通过tree.selection()可获取选中内容,其返回值是一个元组;如果改用tree.focus(),则可返回焦点所在的节点。
当然,这两个函数不仅有读取的功能,当二者有输入时,例如focus(item)
可让item
获得焦点;而selection(selop, items)
,若selop
为None,则以列表形式返回所有items,若selop
指定了选择方法,则按照给定的方法选中相应的items。
绑定滚动条
这种树形图如果全都展开,一定会特别长,为了在有限的区间展示无限多的树形图节点,就需要为其绑定滚动条,其实很简单,只需在mainloop前面添加下面几行代码即可
scroll = ttk.Scrollbar(win)
scroll.config(command=tree.yview)
scroll.pack(side=tk.RIGHT, fill=tk.Y)
# 给treeview添加配置
tree.configure(yscrollcommand=scroll.set)
效果如下