赞
踩
Treeview 组件是 ttk 模块的组件之一,它既可以作为树结构使用,也可以作为表格展示数据(tkinter 并没有表格控件)。
和常见的树状结构一样,当 Treeview 作为树使用时,非叶子节点可以展开和折叠。
本文将详细介绍 Treeview 作为表格和作为树的使用方法,并提供具有源码的示例。
创建 Treeview 使用 ttk.Treeview
类,语法如下:
tree = ttk.Treeview(master, options)
参数 | 作用 |
---|---|
columns | 接收一个列表(tuple),列表中的每个元素都代表表格中的一列(可以理解为 ID),列表的长度就是表格的列数。 |
displaycolumns | 接收一个列表(tuple),列表每个元素都代表 columns 中列的编号,用于设置列表要显示的列,以及显示列的顺序(没有在列表中的列不会显示)。传入"#all" 显示所有列。 |
height | 表格的高度,也就是能够显示的行数。 |
padding | 内容距离组件边缘的距离。 |
selectmode | 有 "extended" (默认选项)、"browse" 、"none" 三种选项,分别代表多选(Ctrl +鼠标左键),单选以及不能改变选项。 |
show | 有 "tree" 、"headings" 、"tree headings" 三种选项,分别代表显示图标列(编号为 "#0" )、不显示图标列(仅显示数值列)以及显示所有列(图标列和数值列)。 个人理解:用作树需要加上"tree" ,用作表使用"headings" 。 |
以下代码展示了将 Treeview 控件作为表格使用,展示一系列数据的方法:
from tkinter import *
from tkinter import ttk
"""
魏大王学编程(www.weidawang.xyz)
tkinter 实用教程系列
Treeview 作为表格使用的简单案例
"""
main = Tk()
data = [(1, "小明", 23, '男', '2021-09-21'), (2, "小强", 23, '男', '2021-09-21'),
(3, "小红", 23, '女', '2021-09-21'), (4, "铁头", 23, '男', '2021-09-21')]
tree = ttk.Treeview(main, columns=('id', 'name', 'age', 'sex', 'birth'), show="headings", displaycolumns="#all")
tree.heading('id', text="编号", anchor=W)
tree.heading('name', text="姓名", anchor=W)
tree.heading('age', text="年龄", anchor=W)
tree.heading('sex',text="性别",anchor=W)
tree.heading('birth', text="出生日期", anchor=W)
for itm in data:
tree.insert("",END,values=itm)
tree.pack(expand=1, fill=BOTH)
main.mainloop()
代码执行结果如下图所示:
from tkinter import *
from tkinter import ttk
"""
魏大王学编程(www.weidawang.xyz)
tkinter 实用教程系列
Treeview 作为树使用的简单案例
"""
main = Tk()
data = [(1, "小明", 23, '男', '2021-09-21'), (2, "小强", 23, '男', '2021-09-21'),
(3, "小红", 23, '女', '2021-09-21'), (4, "铁头", 23, '男', '2021-09-21')]
tree = ttk.Treeview(main, columns=('id', 'name', 'age', 'sex','birth'), show="tree headings", displaycolumns="#all")
tree.heading("#0", text="学校", anchor=W)
tree.heading('id', text="编号", anchor=W)
tree.heading('name', text="姓名", anchor=W)
tree.heading('age', text="年龄", anchor=W)
tree.heading('sex', text="性别", anchor=W)
tree.heading('birth', text="出生日期", anchor=W)
stu_root = tree.insert("", END, text="学生")
man = tree.insert(stu_root, END, text="男")
wom = tree.insert(stu_root, END, text="女")
for itm in data:
if(itm[3]=="男"):
tree.insert(man,END,text=itm[1],values=itm)
else:
tree.insert(wom,END,text=itm[1],values=itm)
tree.pack(expand=1, fill=BOTH)
main.mainloop()
代码执行结果:
如果将代码中 displaycolumns="#all"
修改为 displaycolums=()
,树的效果如下:
向 Treeview 对象中插入一个子节点,需要使用 insert
方法:
itm = tree.insert(options)
insert
函数的返回值,就是插入节点的对象。
参数列表如下:
参数 | 描述 |
---|---|
parent | 指定父节点,如果需要插入根节点,传入"" 。 |
index | 指定插入位置,0 表示在头部插入,END 表示在尾部插入。 |
text | 指定在图标栏展示的内容,也就是在编号"#0" 列展示的内容,只有 show 参数包含 tree 时才能看到。 |
values | 指定在数据列展示的内容,也就是 columns 指定的列。 |
image | 指定图标栏显示的图标,是一个PhotoImage 对象 |
Treeview 有三个虚拟事件分别是:
<<TreeviewSelect>>
:选中项发生变化时触发该事件;<<TreeviewOpen>>
:当菜单项open=True时触发该事件;<<TreeviewClose>>
:当菜单项open=False时触发该事件;这些事件的使用方法和之前的控件一样,比较简单,下文有案例,不过多解释。
获取当前选中项有两种情况,第一种就是单选项的获取,比较简单,而多选项的获取稍微复杂了一点。
先使用 Treeview 的 focus() 方法获取当前焦点项,再利用 set
方法获取焦点项的值。
获取到的值就是在插入表、树子节点时时指定的 values
值。
foc = tree.focus()
val = tree.set(foc)
示例代码如下:
from tkinter import *
from tkinter import ttk
"""
魏大王学编程(www.weidawang.xyz)
tkinter 实用教程系列
Treeview 事件案例
"""
def onSelect(e):
itm = tree.set(tree.focus())
print(itm)
pass
main = Tk()
data = [(1, "小明", 23, '男', '2021-09-21'), (2, "小强", 23, '男', '2021-09-21'),
(3, "小红", 23, '女', '2021-09-21'), (4, "铁头", 23, '男', '2021-09-21')]
tree = ttk.Treeview(main, columns=('id', 'name', 'age', 'sex',
'birth'), show="headings", displaycolumns="#all")
tree.heading('id', text="编号", anchor=W)
tree.heading('name', text="姓名", anchor=W)
tree.heading('age', text="年龄", anchor=W)
tree.heading('sex',text="性别",anchor=W)
tree.heading('birth', text="出生日期", anchor=W)
for itm in data:
tree.insert("",END,values=itm)
tree.pack(expand=1, fill=BOTH)
tree.bind("<<TreeviewSelect>>",onSelect)
main.mainloop()
先使用 Treeview 的 selection() 方法获取所有选中项的 ID,然后再使用 set() 方法获取对应项的值。
selects = tree.selection()
values = tree.set(selects)
使用示例如下:
from tkinter import *
from tkinter import ttk
"""
魏大王学编程(www.weidawang.xyz)
tkinter 实用教程系列
Treeview 多项选中事件案例
"""
def onSelect(e):
ss = tree.selection()
for s in ss:
itm = tree.set(s)
print(itm)
pass
main = Tk()
data = [(1, "小明", 23, '男', '2021-09-21'), (2, "小强", 23, '男', '2021-09-21'),
(3, "小红", 23, '女', '2021-09-21'), (4, "铁头", 23, '男', '2021-09-21')]
tree = ttk.Treeview(main, columns=('id', 'name', 'age', 'sex',
'birth'), show="headings", displaycolumns="#all")
tree.heading('id', text="编号", anchor=W)
tree.heading('name', text="姓名", anchor=W)
tree.heading('age', text="年龄", anchor=W)
tree.heading('sex',text="性别",anchor=W)
tree.heading('birth', text="出生日期", anchor=W)
for itm in data:
tree.insert("",END,values=itm)
tree.pack(expand=1, fill=BOTH)
tree.bind("<<TreeviewSelect>>",onSelect)
main.mainloop()
执行效果如下:
存在这样一种需求,在树状结构中,我希望当我选中一个非叶子节点之后,所有的子节点(或者子节点的子节点)的叶子节点都被选中。
例如,当选中树的根节点,所有叶子节点全部被选中。
示例代码如下:
from tkinter import *
from tkinter import ttk
from queue import Queue
"""
魏大王学编程(www.weidawang.xyz)
tkinter 实用教程系列
Treeview 多级选中
"""
def onSelect(e):
ss = tree.selection()
q = Queue(maxsize=0)
leafs = []
for itm in ss:
q.put(itm)
while(q.qsize()):
node = q.get()
childs = tree.get_children(node)
if(childs):# note非叶子节点
for c in childs:
q.put(c)
else:
if(node not in leafs):#防止父节点和子节点同时被选中,去重
leafs.append(node)
for leaf in leafs:
print(tree.set(leaf))
pass
main = Tk()
data = [(1, "小明", 23, '男', '2021-09-21'), (2, "小强", 23, '男', '2021-09-21'),
(3, "小红", 23, '女', '2021-09-21'), (4, "铁头", 23, '男', '2021-09-21')]
tree = ttk.Treeview(main, columns=('id', 'name', 'age', 'sex','birth'), show="tree", displaycolumns="#all")
tree.heading("#0", text="学校", anchor=W)
tree.heading('id', text="编号", anchor=W)
tree.heading('name', text="姓名", anchor=W)
tree.heading('age', text="年龄", anchor=W)
tree.heading('sex', text="性别", anchor=W)
tree.heading('birth', text="出生日期", anchor=W)
stu_root = tree.insert("", END, text="学生")
man = tree.insert(stu_root, END, text="男")
wom = tree.insert(stu_root, END, text="女")
for itm in data:
if(itm[3]=="男"):
tree.insert(man,END,text=itm[1],values=itm)
else:
tree.insert(wom,END,text=itm[1],values=itm)
tree.pack(expand=1, fill=BOTH)
tree.bind("<<TreeviewSelect>>",onSelect)
main.mainloop()
代码执行结果如下:
点击根节点,选中所有根节点下的叶子节点。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。