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

本文详细介绍了Tkinter的ttk.Treeview组件,它可以作为表格或树结构使用。Treeview提供了创建表格和树的示例,包括设置列、插入数据、处理事件及获取选中项的方法。示例代码展示了如何创建表格展示数据,以及构建树结构并根据性别分类学生数据。此外,还探讨了如何处理Treeview的选中事件,包括单选、多选和多级选中操作。
摘要由CSDN通过智能技术生成

TreeView 的使用方法

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

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

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

目录

tkinter Treeview 控件的使用方法

创建 Treeview 控件

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

tree = ttk.Treeview(master, options)

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()

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

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()

代码执行结果:

02_as_tree.png

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

03_as_tree2.png

Treeview 插入子节点

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

itm = tree.insert(options)

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)

示例代码如下:

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()

04_get_select.png

多选项获取

先使用 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()

执行效果如下:

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()

代码执行结果如下:

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

06_tree_ms.png

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@魏大大

我们都没有打赏的习惯

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值