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

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](https://img-blog.csdnimg.cn/img_convert/7acb040a760ff015031e49cc85502024.png)



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



![03_as_tree2.png](https://img-blog.csdnimg.cn/img_convert/4cec4de0fc298066219c521b9d270970.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(“<>”,onSelect)

main.mainloop()




![04_get_select.png](https://img-blog.csdnimg.cn/img_convert/a945c3aafd3294ac225b227ca00079b7.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(“<>”,onSelect)

main.mainloop()




执行效果如下:



![05_ms.png](https://img-blog.csdnimg.cn/img_convert/8e70d64d9d781419d486b9137761b25c.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=“学生”)

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-oniYmIfS-1715034675578)]

[外链图片转存中…(img-n0gUsjpI-1715034675578)]

[外链图片转存中…(img-6SDipZaH-1715034675579)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 28
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值