当前位置:   article > 正文

《tkinter实用教程21》treeview 节点插入、单选、多选、事件、树、表格_tkinter treeview

tkinter treeview

TreeView 的使用方法

Treeview 组件是 ttk 模块的组件之一,它既可以作为树结构使用,也可以作为表格展示数据(tkinter 并没有表格控件)。

和常见的树状结构一样,当 Treeview 作为树使用时,非叶子节点可以展开和折叠。

本文将详细介绍 Treeview 作为表格和作为树的使用方法,并提供具有源码的示例。

目录

tkinter Treeview 控件的使用方法

创建 Treeview 控件

创建 Treeview 使用 ttk.Treeview 类,语法如下:

tree = ttk.Treeview(master, options)
  • 1

Treeview 参数解读

参数作用
columns接收一个列表(tuple),列表中的每个元素都代表表格中的一列(可以理解为 ID),列表的长度就是表格的列数。
displaycolumns接收一个列表(tuple),列表每个元素都代表 columns 中列的编号,用于设置列表要显示的列,以及显示列的顺序(没有在列表中的列不会显示)。传入"#all"显示所有列。
height表格的高度,也就是能够显示的行数。
padding内容距离组件边缘的距离。
selectmode"extended"(默认选项)、"browse""none"三种选项,分别代表多选(Ctrl+鼠标左键),单选以及不能改变选项。
show"tree""headings""tree headings" 三种选项,分别代表显示图标列(编号为 "#0")、不显示图标列(仅显示数值列)以及显示所有列(图标列和数值列)。 个人理解:用作树需要加上"tree",用作表使用"headings"

作为表格使用 Treeview

以下代码展示了将 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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

代码执行结果如下图所示:

01_create.png

作为树使用 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="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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

代码执行结果:

02_as_tree.png

如果将代码中 displaycolumns="#all" 修改为 displaycolums=() ,树的效果如下:

03_as_tree2.png

Treeview 插入子节点

向 Treeview 对象中插入一个子节点,需要使用 insert 方法:

itm = tree.insert(options)
  • 1

insert 函数的返回值,就是插入节点的对象。

参数列表如下:

参数描述
parent指定父节点,如果需要插入根节点,传入""
index指定插入位置,0表示在头部插入,END表示在尾部插入。
text指定在图标栏展示的内容,也就是在编号"#0"列展示的内容,只有 show 参数包含 tree 时才能看到。
values指定在数据列展示的内容,也就是 columns 指定的列。
image指定图标栏显示的图标,是一个PhotoImage对象

Treeview 事件

Treeview 有三个虚拟事件分别是:

  • <<TreeviewSelect>>:选中项发生变化时触发该事件;
  • <<TreeviewOpen>>:当菜单项open=True时触发该事件;
  • <<TreeviewClose>>:当菜单项open=False时触发该事件;

这些事件的使用方法和之前的控件一样,比较简单,下文有案例,不过多解释。

如何获取当前选中项

获取当前选中项有两种情况,第一种就是单选项的获取,比较简单,而多选项的获取稍微复杂了一点。

单选项获取

先使用 Treeview 的 focus() 方法获取当前焦点项,再利用 set 方法获取焦点项的值。

获取到的值就是在插入表、树子节点时时指定的 values 值。

foc = tree.focus()
val = tree.set(foc)
  • 1
  • 2

示例代码如下:

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

04_get_select.png

多选项获取

先使用 Treeview 的 selection() 方法获取所有选中项的 ID,然后再使用 set() 方法获取对应项的值。

selects = tree.selection()
values = tree.set(selects)
  • 1
  • 2

使用示例如下:

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

执行效果如下:

05_ms.png

Tree 选中子节点

存在这样一种需求,在树状结构中,我希望当我选中一个非叶子节点之后,所有的子节点(或者子节点的子节点)的叶子节点都被选中。

例如,当选中树的根节点,所有叶子节点全部被选中。

示例代码如下:

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

代码执行结果如下:

点击根节点,选中所有根节点下的叶子节点。

06_tree_ms.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/975510
推荐阅读
相关标签
  

闽ICP备14008679号