news 2026/7/18 19:09:19

tkinter绘制组件(50)——高级树状图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
tkinter绘制组件(50)——高级树状图

tkinter绘制组件(50)——高级树状图

  • 引言
  • 节点元素
  • 高级树状图控件
    • 获取当前选中元素
    • 添加节点
    • 删除节点
    • 重命名节点
    • 折叠、展开所有
    • 事件绑定
    • 面板布局
  • 效果
  • github项目
  • pip下载

引言

在tkinter绘制组件(36)——树状图_tkinter树形结构-CSDN博客详细给出了TinUI初版树状图的构建方法。TinUI原生treeview基本没有任何交互能力,仅仅是数据结构的一种可视化展示。由于树状图的复杂性,即便极尽简化,为了使其具有基本交互能力,也不适用于在TinUI标准内容中进行功能添加。因此,一个更加高级的TinUI树状图控件在Smart-Space/TinUITreeview: TinUI高级树状图控件中单独提供。

TinUITreeview为独立项目,使用pip安装:

pip install tinuitreeview

如上文所说,树状图仍然是TinUI迄今为止最复杂的控件,而且这个“上位替代”继承了原生树状图的主要构建方法,因此,本文基本上只讲怎么用。


节点元素

TinUITreeview内部使用节点元素来表示每个节点,其类型:

classTinUITreeItem:""" 代表树中的一个节点,持有画布对象 id 以及父/子关系。 属性(只读,由 TinUITreeView 维护): text - 节点显示文本 back - 背景矩形画布 id(也是 items 字典的键) te - 文字画布 id sign - 展开/收起三角图标画布 id(叶节点为 None) parent - 父 TinUITreeItem,根节点为 None children - 子 TinUITreeItem 列表 """def__init__(self,text:str,back,te,sign=None,parent=None):self.text:str=text self.back=back# 背景self.te=te# 文字self.sign=sign# 折叠图标,叶节点为 Noneself.parent:TinUITreeItem|None=parent self.children:list[TinUITreeItem]=[]

注释里面也提到,使用者几乎不需要关心这个类是什么,但是其下成员属性仍可由使用者随时获取。

高级树状图控件

classTinUITreeView:_ICON_OPEN="\ue96e"_ICON_CLOSED="\ue970"def__init__(self,master:BasicTinUI,pos:tuple,fg="#1a1a1a",bg="#f3f3f3",onfg="#1a1a1a",onbg="#eaeaea",oncolor="#3041d8",signcolor="#8a8a8a",width=200,height=300,font="微软雅黑 12",content=(("one",("1","2","3")),"two",("three",("a",("b",("b1","b2","b3")),"c")),"four",),anchor="nw",command=None,):#...

其初始化参数与原生treeview一模一样,基本可以无缝切换。

需要注意的是,command回调函数必须接受一个参数,即选中项的路径,确切来说,就是一个TinUITreeItem列表,从最高级节点到选中节点。

获取当前选中元素

get_selected(self)->TinUITreeItem|None

通过调用该方法,可获取当前选中的元素。

添加节点

add_node(self,text:str,parent:TinUITreeItem|None=None,)->TinUITreeItem

parent为None时,即是向顶层末尾添加元素。如果parent存在且其本身是亲节点,则添加在下级末尾;否则会自动将其转为亲节点,并赋予展开与折叠功能。

会返回一个新建的元素。

删除节点

remove_node(self,item:TinUITreeItem)

删除节点及其所有后代。

若被删节点是亲节点的最后一个子节点,则移除亲节点的折叠图标,删除其展开与折叠功能。

重命名节点

rename_node(self,item:TinUITreeItem,new_text:str)

给指定元素重命名。

可以重名(当然,包括上级),树状图内部靠元素id进行关系管理,不过这是不必要的。

折叠、展开所有

defclose_all(self):foriteminlist(self._item_map.values()):ifitem.signandself._box.itemcget(item.sign,"text")==self._ICON_OPEN:self._close_view(item)defopen_all(self):foriteminlist(self._item_map.values()):ifitem.signandself._box.itemcget(item.sign,"text")==self._ICON_CLOSED:self._open_view(item)

这部分同原生treeview

事件绑定

defbind(self,sequence=None,func=None,add=None):"""绑定事件,代理给画布实现"""returnself._box.bind(sequence,func,add)defunbind(self,sequence,funcid=None):"""解绑事件,代理给画布实现"""self._box.unbind(sequence,funcid)

面板布局

使用TinUITreeView.uid获取控件uid,用于TinUI面板布局。其行为与原生treeview一致。


效果

测试代码:

deftest(path):print("选中路径:"," > ".join(n.textforninpath))root=tk.Tk()tinui=BasicTinUI(root)tinui.pack(fill='both',expand=True)tree=TinUITreeView(tinui,(50,50),command=test)# 增new_item=tree.add_node("新节点")# 添加到根child=tree.add_node("子节点",parent=new_item)# 添加到指定节点下# 删# tree.remove_node(child) # 同时删除所有后代,父节点若变为空则自动降级为叶节点# 改tree.rename_node(new_item,"renamed")# 查# selected = tree.get_selected() # 返回 TinUITreeItem 或 None# print("当前选中:", selected)# 展开/折叠tree.close_all()root.after(2000,tree.open_all)# 2秒后展开所有节点rp=ExpandPanel(tinui,tree.uid)defon_resize(e):rp.update_layout(5,5,e.width-5,e.height-5)tinui.bind("<Configure>",on_resize)root.mainloop()


github项目

TinUI的github项目地址

pip下载

pipinstalltinui
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 14:11:06

文脉定序部署案例:高校图书馆数字资源平台语义增强检索落地

文脉定序部署案例&#xff1a;高校图书馆数字资源平台语义增强检索落地 1. 项目背景与需求分析 高校图书馆数字资源平台面临着海量学术资源的检索挑战。传统关键词匹配方式虽然能够快速返回大量结果&#xff0c;但在排序精准度上存在明显不足。读者经常遇到"搜得到但排不…

作者头像 李华
网站建设 2026/7/14 14:11:07

中国土地利用30年变迁可视化指南:基于CLCD数据的Python分析全流程

中国土地利用30年变迁可视化指南&#xff1a;基于CLCD数据的Python分析全流程 过去三十年&#xff0c;中国经历了人类历史上规模最大、速度最快的城市化进程。从沿海经济特区的崛起到西部大开发的推进&#xff0c;每一寸土地的变迁都承载着经济发展的密码。对于数据爱好者和城市…

作者头像 李华
网站建设 2026/7/14 14:11:04

Gemma-3-270m参数详解:270M规模下模型结构、tokenizer与量化选项说明

Gemma-3-270m参数详解&#xff1a;270M规模下模型结构、tokenizer与量化选项说明 1. 模型架构深度解析 Gemma-3-270m作为谷歌Gemma 3系列中最轻量级的模型&#xff0c;虽然只有2.7亿参数&#xff0c;但在架构设计上却体现了现代Transformer的精髓。 1.1 核心架构特点 Gemma…

作者头像 李华
网站建设 2026/7/14 14:11:44

nomic-embed-text-v2-moe入门指南:理解Finetune Data缺失对领域迁移的影响

nomic-embed-text-v2-moe入门指南&#xff1a;理解Finetune Data缺失对领域迁移的影响 1. 引言&#xff1a;从通用到专业&#xff0c;嵌入模型面临的核心挑战 如果你正在寻找一个强大的文本嵌入模型来处理多语言内容&#xff0c;nomic-embed-text-v2-moe很可能已经进入了你的…

作者头像 李华
网站建设 2026/7/14 14:11:08

Z-Image Atelier 数据预处理实战:Python入门之图像数据集清洗

Z-Image Atelier 数据预处理实战&#xff1a;Python入门之图像数据集清洗 你是不是也遇到过这种情况&#xff1a;在网上找到一堆图片&#xff0c;兴冲冲地想用来训练一个AI模型&#xff0c;结果发现图片尺寸五花八门&#xff0c;有的带水印&#xff0c;有的模糊不清&#xff0…

作者头像 李华
网站建设 2026/7/14 14:11:27

GME多模态向量模型效果惊艳展示:十类场景图像理解能力实测

GME多模态向量模型效果惊艳展示&#xff1a;十类场景图像理解能力实测 最近在测试各种多模态模型&#xff0c;一个叫GME的向量模型&#xff08;具体是基于Qwen2-VL-2B的版本&#xff09;引起了我的注意。官方介绍说得挺厉害&#xff0c;但实际用起来到底怎么样&#xff1f;光看…

作者头像 李华