TreeView 的使用方法

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

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

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

目录

  • tkinter Treeview 控件的使用方法

    • 创建 Treeview 控件
    • Treeview 参数解读
    • 作为表格使用 Treeview
    • 作为树使用 Treeview
    • Treeview 插入子节点
    • Treeview 事件
    • 如何获取当前选中项
      • 单选项获取
      • 多选项获取
      • Tree 选中子节点

更多《Tkinter 实用教程》系列文章

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

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

作为树使用 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()

代码执行结果:

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

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

执行效果如下:

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

代码执行结果如下:

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

更多Tkinter系列文章

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

  1. 《tkinter实用教程四》tkinter 布局管理 Grid

    更多<Tkinter 实用教程>系列文章 tkinter 表格布局管理 Grid 在学习其他控件之前,我们需要先了解 tkinter 布局管理概念(解决控件放在哪里的问题). 虽然, tk ...

  2. 软件测试实用教程答案,软件测试实用教程

    摘要: <软件测试实用教程(21世纪高等学校计算机规划教材)>(作者周元哲)较为全面,系统地介绍了当前软件测试领域的理论和实践知识,内容包括当前最新的软件测试理论,标准,技术和工具,展望了 ...

  3. 《tkinter实用教程一》Linux环境下安装tkinter

    更多<Tkinter 实用教程>系列文章 在 Linux 环境下安装 tkinter tkinter 是 Python 编程语言中描述用于构建图形用户界面 (GUI) 的控件集,因此,学习 ...

  4. 个人永久性免费-Excel催化剂功能第58波-批量生成单选复选框

    插件的最大威力莫过于可以把简单重复的事情批量完全,对日常数据采集或打印报表排版过程中,弄个单选.复选框和用户交互,美观的同时,也能保证到数据采集的准确性,一般来说用原生的方式插入单选.复选框,操作繁琐 ...

  5. 石正喜MySQL数据库使用教程_《21世纪高职高专系列规划教材:MySQL数据库实用教程》【摘要 书评 在线阅读】-苏宁易购图书...

    商品参数 作者: 石正喜编 出版社:北京师范大学出版社 出版时间:2014-01-01 00:00:00 版次:1 印次:1 印刷时间:2014-01-01 字数:400000 页数:298 开本:1 ...

  6. 专科计算机考试教程,21世纪高职高专通用教材:新编全国计算机等级考试一级B实用教程...

    摘要: <新编全国计算机等级考试一级B实用教程>是各专业学生必修的计算机基础课程,是学习其他计算机相关课程的基础课.因此,本教材的编写,要跟踪计算机技术发展的趋势,充分反映本学科领域的最新 ...

  7. 【微信小程序-原生开发】实用教程05-首页(含自定义调试模式、插入图片、图文排版、底部留白、添加本地图片)

    开始前,请先完成启动/欢迎/首屏广告页的开发,详见 [微信小程序-原生开发]实用教程04-启动/欢迎/首屏广告页(含倒计时.添加文字.rpx.定义变量和函数.读取变量.修改变量.wx.reLaunch ...

  8. 全国泰州市专业技术人员计算机考试,泰州市专业技术人员实用教程试题及答案(92分)...

    <泰州市专业技术人员实用教程试题及答案(92分)>由会员分享,可在线阅读,更多相关<泰州市专业技术人员实用教程试题及答案(92分)(8页珍藏版)>请在人人文库网上搜索. 1.泰 ...

  9. SESAM | GeniE 实用教程

    目 录 Blog Links 一.前言 1.1 Sesam/GeniE 1.2 GeniE分析流程 1.3 图形用户界面 1.4 视图/选择 1.5 帮助文档 二.几何.结构与网格 2.1 Guidi ...

最新文章

  1. Node.js入门(含NVM、NPM、NVM的安装)
  2. 鲸鱼优化算法_Java 代码优化细节之比比谁更细
  3. Linux安装及服务控制
  4. 【读书笔记】Android的Ashmem机制学习
  5. 分别统计出其中英文字母、空格、数字和其它字符的个数 matlab 程序,编写一段程序,要求先输入一行字符,然后分别统计出其中英文...
  6. 【译】你不知道的 Chrome 调试工具技巧 第二十天:Workspace的黑魔法
  7. 企业实战|企业FTP搭建
  8. linux 不支持设置属性,Linux gcc支持的语法 __attribute__ 属性设置
  9. 清明节 java_清明节习俗
  10. 使用SCCM管理Office ProPlus(二)--升级最到最新更新
  11. 运行 Android 的笔记本 Cosmo 已众筹超 130 万美元
  12. 高速扩张的云市场,需要怎样的安全能力?
  13. 任何人都有值得学习的地方,横瓜向[水牛党](4618415)请教问题
  14. Vins-Mono系列代码和理论解读<五>.位姿图Pose_graph理论和代码实现细节
  15. 凯云水利水电工程造价管理系统 技术解释(十三) 中间单价(四)
  16. 功能强大、多合一,Java性能调优VisualVM多合一工具
  17. 美剧推荐:abc新剧Traveler
  18. Mobius函数(模板)
  19. 什么是BFC?BFC的功能及其使用?
  20. python dataframe去掉索引_python中pandas.DataFrame(创建、索引、增添与删除)的简单操作方法介绍...

热门文章

  1. el-button入门学习
  2. 我是怎么”败光”千万投资
  3. mysql--使用full join报错
  4. 计算机组成原理 存储器实验
  5. 做Shopee必须把握的店铺规划,你会吗
  6. Android开发——集成友盟推送SDK遇到的坑(一)
  7. JavaWeb:Criteria类添加或条件
  8. HashMap线程不安全的原因和解决方案
  9. html---文本框样式;
  10. 微信小程序利用云开发实现评论功能