Python+tkinter实现树形图绘制
作者:微小冷
初步
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)
效果如下

到此这篇关于Python+tkinter实现树形图绘制的文章就介绍到这了,更多相关Python tkinter树形图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
