在 Tkinter 中,Treeview
是 ttk
模块提供的一个控件,主要用于显示分层或表格形式的数据。
常用方法
按功能进行分类
1. 节点操作
-
插入节点
insert(parent, index, iid=None, text='', values=())
- 在指定父节点下插入新节点。
-
删除节点
delete(*items)
- 删除指定的节点。
-
移动节点
move(item, parent, index)
- 将节点移动到新的父节点下,指定位置。
-
节点标识获取
item(item_id, option=None)
- 获取或设置指定节点的信息。
2. 节点属性
-
获取子节点
get_children(item=None)
- 获取指定节点的直接子节点(如果未指定则返回根节点的子节点)。
-
设置节点值
set(item, column=None, value=None)
- 设置某节点某列的值,未指定
column
时返回所有列的值。
- 设置某节点某列的值,未指定
-
获取节点文本
item(item_id, 'text')
- 获取节点的显示文本。
3. 选择操作
-
获取选中节点
selection()
- 返回当前选中的节点 ID 列表。
-
设置选中节点
selection_set(items)
- 设置指定节点为选中状态。
-
清除选中节点
selection_remove(items)
- 清除指定节点的选中状态。
-
清空所有选中
selection_clear()
- 清空所有节点的选中状态。
4. 展开与折叠
-
展开节点
item(item_id, open=True)
- 展开指定节点。
-
折叠节点
item(item_id, open=False)
- 折叠指定节点。
-
检查展开状态
item(item_id, 'open')
- 返回节点是否展开的状态。
5. 列操作
-
设置列标题
heading(column, option, value)
- 设置列标题及其属性(如文本、排序等)。
-
列宽设置
column(column, option=None, **kw)
- 设置列的宽度、对齐方式等属性。
-
获取列列表
columns
属性- 返回当前表格的所有列名称。
6. 滚动支持
- 绑定滚动条
- 通过
yview
和xview
方法支持垂直或水平滚动。
- 通过
7. 事件绑定
- 绑定事件
bind(event, handler)
- 绑定事件,例如
<ButtonRelease-1>
、<<TreeviewSelect>>
等。
- 绑定事件,例如
8. 数据更新
- 刷新显示
update()
- 强制更新 Treeview 的显示。
总结
- 增删改查数据:
insert()
、delete()
、item()
、set()
。 - 层次结构管理:
get_children()
、move()
、item()
。 - 交互操作:
selection()
系列方法、事件绑定。 - 可视化调整:
column()
、heading()
、展开与折叠相关方法。
一个节点就是展示数据的一行,根据iid 唯一识别.iid可以在insert()时指定.也可以通过 iid= treeview.insert 获取. 调用selection()返回的也是iid值.
案例
from tkinter import *
from tkinter.ttk import *
# ---------- 创建窗口 -----------
root = Tk()
screenwidth = root.winfo_screenwidth()
screenheight = root.winfo_screenheight()
width = int(screenwidth/2)
height = int(screenheight/2)
x = int(screenwidth/4)
y = int(screenheight/4)
place = f"{width}x{height}+{x}+{y}"
root.geometry(place)
# ----------- tv -----------------
# 选择数据
def treeSelect(event):
widgetobj = event.widget
itemselect = widgetobj.selection()
# print(tv.item(itemselect,"values"))
var.set(tv.item(itemselect,"values"))
print(tv.set(itemselect,"title"))
# 双击
def doubleclick(event):
e = event.widget
print(e.selection())
tv = Treeview(root, selectmode="browse", show="tree headings")
tv["columns"]=("title", "author", "time")
# 表格头
tv.heading("#0", text="折叠")
tv.heading("title", text="书名")
tv.heading("author", text="作者")
tv.heading("time", text="发布时间")
# 格式化列
tv.column("title",anchor=CENTER)
tv.column("author",anchor=CENTER)
tv.column("time",anchor=CENTER)
# 指定/获取iid值
iid = tv.insert("",index=END,iid="x-001",text="上层")
for i in range(50):
tv.insert(iid, index=END, values=(f"此间鸟兽-{i}", "任", f"2025-{i}"))
# 滚动条
vsb = Scrollbar(root,orient="vertical", command=tv.yview)
hsb = Scrollbar(root,orient="horizontal", command=tv.xview)
vsb.pack(side="right", fill="y")
hsb.pack(side="bottom", fill="x")
tv.configure(xscrollcommand=hsb.set, yscrollcommand=vsb.set)
# 事件绑定
tv.bind("<<TreeviewSelect>>", treeSelect)
tv.bind('<Double-1>', doubleclick)
# 动态获取
var = StringVar()
label = Label(root,textvariable=var)
# 展开折叠
tv.item(iid, open=True)
tv.pack()
label.pack()
# 主循环
root.mainloop()
总结
iid
(Item ID)是每个节点(项)的唯一标识符。iid
用于区分和引用不同的节点,通常在添加、修改、删除或查询节点时使用。先通过colums申明计算机识别的列名;再通过heading,设置用户查看的显示文本.