目录

一、前言

二、TreeView的引入

三、TreeView的属性

四、TreeView的item选项

五、列标识符

六、TreeView触发事件

七、TreeView点击事件

八、TreeView中常用的方法

九、TreeView实例

使用TreeView创建表格

使用get_children()方法

使用focus() 获取 item

使用see()方法使item位于树的可见部分

使用selection_set()方法设置新选择的item/items

使用selection()方法获取item/items

使用selection_add()追加选择

使用selection_remove()把指定的item从选择中移除

使用set()方法返回或修改item值

使用table.tag_has()/table.tag_configure()/table.tag_bind()

使用next()/parent()/prev()方法

使用index()方法返回item在items列表中的整数索引

使用delete()方法删除第一行数据

使用detach()方法隐藏第一行数据

使用move()方法使隐藏第一行数据重新显示在第二行

使用exists()方法判断item是否存在

使用bbox()方法返回指定item的边界框

使用identify()/identify_row()/identify_column()/identify_region()/identify_element()方法返回指定组件的描述)

创建一个可编辑单元格的表格




一、前言

TreeView是它是用来展示树形结构或列表结构的一个UI控件;第一列用来表示树状结构,除第一列外后面几列的是列表结构

二、TreeView的引入

import tkinter.ttk as ttk

三、TreeView的属性

属性 描述
master 父布局     必要
columns

columns    值为一个列表,列表里每个元素代表一个列标识符的名称  必要

例:columns=['序号', '权限', '用户', '密码']

displaycolumns

列标识符列表(符号索引或整数索引),指定显示哪些数据列以及它们出现的顺序,或者字符串“#all”

例:定义了上面的列之后 使用 displaycolumns=[2, 3, 1]

显示的列和顺序是: 用户    密码    权限

height 可见的行数,显示几行数据 (若实际数据少于设置的行数,则按实际数据显示)
padding

内部填充,填充是一个最多包含四个长度列表(左,上,右,下)

例:padding=[20,10,20,10]

左边填充:20    上面填充:20      右边填充:20     下面填充:20

例:padding=[50]上下左右各填充:50

selectmode

“extended”(默认值)可以选择多个(行)项目(用Ctrl+鼠标)

“browse”每次只会选中一行。

“none”不更改选择

例:selectmode=“extended”

show

"tree headings"表示显示所有列,默认值(列表模式)

“tree”表示仅显示第一列(树模式)

“headings”表示显示除一列的其他列(列表模式)

注意:‘#0’(第一列)是永远存在的

例: show="headings"

style TreeView的样式
xscrollcommand

X轴滚动条的绑定

yscrollcommand Y轴滚动条的绑定

四、TreeView的item选项

属性 描述
text 显示的文本标签
image 显示在item左侧的Tk Image
values

与该item相关联的值的列表,每个item应该具有与列数相同数量的值

如果值少于列数,则假定其余值为空。如果值多于列数,则忽略额外的值

open

True   显示item

False  隐藏item

tags 与此item相关联的标签列表

属性 描述
foreground 文本前景色
background 指定单元格或item的背景颜色
font 指定文本的字体
image 指定item图像

五、列标识符

表格创建好后就可以操作表格通过列标识

列标识符采用以下3种形式

1. 创建表格时列名称列表中的符号名称

例:

['序号', '权限', '用户', '密码']     列表

('序号', '权限', '用户', '密码')     元组

2. 整数n,指定第n个数据列

例:

[1, 2, 3, 4]   列表

(1, 2, 3, 4)   元组

3. 形式为#n的字符串,其中n为整数,指定显示的第n列

例:

["#1", "#2", "#3", "#4"]    列表

("#1", "#2", "#3", "#4")    元组

item的值的显示顺序可能与它们存储的顺序不同
列#0总是指向树列,即使没有指定show= " tree "(单树模式)。
列号是item值列表的索引,树标签显示在第0列中。如果选项displaycolumns没有设置,那么数据列n将显示在列#n+1中;列#0总是指向树列。

六、TreeView触发事件

事件 描述
<<TreeviewSelect>> 当选择更改时发生
<<TreeviewOpen>> item的open=True时发生
<<TreeviewClose>> item的open=False时发生

可用 Treeview.focus() 和 Treeview.selection() 可获取 item 或 items

七、TreeView点击事件

事件 代码
鼠标左键单击按下 1/Button-1/ButtonPress-1
鼠标左键单击松开 ButtonRelease-1
鼠标右键单击 3
鼠标左键双击 Double-1/Double-Button-1
鼠标右键双击 Double-3
鼠标滚轮单击 2
鼠标滚轮双击 Double-2
鼠标移动 B1-Motion
鼠标移动到区域 Enter
鼠标离开区域 Leave
获得键盘焦点 FocusIn
失去键盘焦点 FocusOut
键盘事件 Key
回车键 Return
控件尺寸变化 Configure

八、TreeView中常用的方法

方法 描述及返回值
heading(columnoption=None**kw)

查询或设定指定列的标题选项。
如果没有给出kw,则返回标题选项值的字典。

如果指定了选项,则返回该选项的值。

否则,将选项设置为相应的值

option
text 显示在列标题中的文本
image 要显示在列标题右侧的图像
anchor 指定标题文本的对齐方式
command 当按下标题标签时要调用的回调
column(columnoption=None**kw)

查询或设定指定列的选项

column是列标识符
如果没有给出kw,则返回列选项值的字典

如果指定了选项,则返回该选项的值

否则,将选项设置为相应的值

option
id 返回列名标识符;只读
anchor 指定列中的文本应如何相对于单元格对齐
minwidth 列的最小宽度,以像素为单位。
width 列的宽度,以像素为单位
stretch TreeView调整大小时是否调整列的宽度
get_children(item=None) 返回属于item的子元素列表
如果item未指定,则返回根目录的item
set_children(item*newchildren)

用newchildren替换item的子元素
在item出现而在newchildren中没有的子元素将从树中分离newchildren中的任何项都不能是item的祖先

不指定newchildren会导致分离item的子元素

一般用于树形结构中

delete(*items) 删除所有指定items及其所有子item
根item目不能被删除
detach(*items)

在树中断开(隐藏)items及子item

重新显示可以move()方法
根item无法分离

move(itemparentindex)

将item移动到parent下的列表中的index位置
如果index小于或等于0,item被移到开头;

如果大于或等于子节点的数量,则将其移动到最后

如果项目被分离,它将被重新添加

exists(item) 如果树中存在指定的item,则返回True
focus(item=None)

如果指定了item,则将焦点项设置为item

否则,返回当前的焦点项

若无则返回空值

使用focus()方法并不会让获得focus的item被高亮显示

如果要高亮显示使用selection_set()方法

bbox(itemcolumn=None)

返回指定item的边界框(x, y, width, height)

如果指定了column,则返回该单元格的边界框

如果项目是不可见的(例如它是一个关闭item的子代或滚动出屏幕),返回一个空字符串

identify(componentxy)

在x和y给出的点下返回指定组件的描述,如果在该位置没有这样的组件,则返回空字符串

component(部件)可选项目
region 区域
item 项目
column
row
element 要素
identify_row(y) 返回位置为y的item的ID
identify_column(x)

返回位置x的单元格的数据列标识符

树列的ID为#0

identify_region(xy)

Tk 8.6.

返回一个

heading 树标题区域
separator 两列标题之间的空格
tree 树的区域
cell 一个数据单元

identify_element(xy)

Tk 8.6.

返回位置为x, y的元素
index(item) 返回子item在父items的列表中的i整数索引
insert(parentindexiid=None**kw)

创建新item并返回新创建item的标识符

parent是父item的ID,若为空字符串则用于创建新根item串

Index是一个整数,或“end”,指定在父item列表中插入新item的位置

如果index小于或等于0,则在开始处插入新节点;如果index大于或等于当前子节点的数量,则将其插入到末尾

iid它被用作item标识符;Iid不能已经存在于树中。否则,将生成一个新的惟一标识符,不指定可自动生成

**kw有关可用列表,请参阅上面TreeView的item选项

item(itemoption=None**kw)

查询或修改指定item的选项
如果没有给出选项,则返回带有该项的选项/值的dict

如果指定了选项,则返回该选项的值

否则,将选项设置为kw给出的相应值

next(item) 返回下一个与item同级的item的标识符
parent(item) 返回item的父元素的ID
prev(item) 返回item的前一个同级的标识符
reattach(itemparentindex) Treeview.move()的别名
see(item) 设置item是可见的。
将item的所有祖先open选项设置为True,并在必要时滚动Treeview,以便item位于树的可见部分中
selection(selop=Noneitems=None)

如果未指定selop,则返回选中的item,列表形式

否则,将按照以下选择方法进行操作
3.6版后已移除,将在3.8版移除:使用selection()改变选择状态已弃用。请使用下面的选择方法

selection_set(*items)

Items成为新的选择

在3.6版更改,项可以作为单独的参数传递,而不只是作为单个元组

selection_add(*items)

向选择items中添加item

在3.6版更改,项可以作为单独的参数传递,而不只是作为单个元组

selection_remove(*items) 从选择items中删除item
在3.6版更改,项可以作为单独的参数传递,而不只是作为单个元组
selection_toggle(*items) 切换items中每个item的选择状态
在3.6版更改,item可以作为单独的参数传递,而不只是作为单个元组
set(itemcolumn=Nonevalue=None)

返回指定item的列/值对字典

只有item和column,返回指定column的value当前值。

item和column和value同时使用,则修改item中指定的列的value

tag_bind(tagnamesequence=Nonecallback=None)

将给定事件序列的回调绑定到标记tagname

当事件被交付给item时,将调用item的每个标签选项的回调

tag_configure(tagnameoption=None**kw)

查询或修改指定标记名的选项

如果指定了option,则为指定的标记名返回该选项的值。否则,将item设置为给定标记名的相应值

如果没有给出kw,则返回tagname的item设置的字典

tag_has(tagnameitem=None)

Tk 8.6.

若指定了item,则根据指定的item是否具有给定的标记名返回True或False

否则,返回具有指定标记的所有item的列表

xview(*args) 查询或修改树视图的水平位置
yview(*args) 查询或修改树视图的垂直位置

九、TreeView实例

使用TreeView创建表格

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))  # 定义表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 定义表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                              # 定义列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:# insert()方法插入数据self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

使用get_children()方法

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)# get_children用法print('根目录所有items:' + str(self.table.get_children()))print(self.table.get_children('I001'))if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

输出结果:

根目录所有子元素列表:('I001', 'I002', 'I003', 'I004', 'I005', 'I006', 'I007', 'I008', 'I009')
指定item所有子元素列表:()

使用focus() 获取 item

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)#使用focus()方法并不会让获得focus的item被高亮显示;如果要高亮显示使用selection_set()方法self.table.focus('I001')if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

使用see()方法使item位于树的可见部分

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)# 将item的所有祖先open选项设置为True,并在必要时滚动Treeview,以便item位于树的可见部分中self.table.see('I009')if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

运行结果可以看到表格滚动到最后一条数据,数据为可视

使用selection_set()方法设置新选择的item/items

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)self.table.selection_set('I003')if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

使用selection()方法获取item/items

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)# 当表格选择改变触发 自定义的方法self.table.bind('<<TreeviewSelect>>', self.selection)def selection(self, event):# selection()方法可获取item或itemsprint('选择的是:' + str(event.widget.selection())) #event.widget获取Treeview对象return "break"if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

运行结果为:

选择的是:('I001', 'I002', 'I003')

使用selection_add()追加选择

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)# 选设定新的选则self.table.selection_set('I003')# 追加两个选择self.table.selection_add('I001', 'I004')if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

使用selection_remove()把指定的item从选择中移除

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)# 设定新的items为选择self.table.selection_set('I003')# 添加新的items为选择self.table.selection_add('I001', 'I004')# 移除选择中的itemsself.table.selection_remove('I001')if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

使用set()方法返回或修改item值

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)# 返回item所有数据字典print('item所有数据字典为:' + str(self.table.set('I001')))# 返回item指定列的数据字典print('item指定列的数据字典为:' + str(self.table.set('I001', column='#3')))# 修改item指定列的数据self.table.set('I001', column='#3', value='admin')if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

使用table.tag_has()/table.tag_configure()/table.tag_bind()

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for i, data in enumerate(tableValues):self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data, tags=str(i))print('item中是否含有该tag:' + str(self.table.tag_has('0', 'I001')))print('含有该tag的items:' + str(self.table.tag_has('0')))print('tagname的选项/属性数据字典:' + str(self.table.tag_configure('1')))print('tagname的指定选项值:' + str(self.table.tag_configure('1', option='anchor')))# 对tagname使用kw中的参数设置有关属性self.table.tag_configure('1', text='你好')print('tagname的指定选项值:' + str(self.table.tag_configure('1')))self.table.tag_bind('1', '<Double-1>', callback=self.bind())def bind(self):print('指定事件绑定')if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

执行后的结果为:

item中是否含有该tag:True
含有该tag的items:('I001',)
tagname的选项/属性数据字典:{'text': '', 'image': '', 'anchor': '', 'background': '', 'foreground': '', 'font': ''}
tagname的指定选项值:
tagname的指定选项值:{'text': '你好', 'image': '', 'anchor': '', 'background': '', 'foreground': '', 'font': ''}
指定事件绑定

使用next()/parent()/prev()方法

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for i, data in enumerate(tableValues):self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data, tags=str(i))print('返回下一个与item同级的item的标识符:' + str(self.table.next('I003')))print('返回item的父元素的ID:' + str(self.table.parent('I003')))print('返回item的前一个同级的标识符:' + str(self.table.prev('I003')))if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

执行后的结果为:

返回下一个与item同级的item的标识符:I004
返回item的父元素的ID:
返回item的前一个同级的标识符:I002

使用index()方法返回item在items列表中的整数索引

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)self.table.bind('<<TreeviewSelect>>', self.select)def select(self, event):print('选则的行在items的列表中的整数索引:' + str(self.table.index(event.widget.selection())))return "break"if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

选则第二行数据执行结果:

选则的行在items的列表中的整数索引:1

使用delete()方法删除第一行数据

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)# delete用法 删除第一个item也就是第一行数据self.table.delete('I001')if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

使用detach()方法隐藏第一行数据

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)# detach用法隐藏第一行数据self.table.detach('I001')if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

使用move()方法使隐藏第一行数据重新显示在第二行

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)# detach方法隐藏第一行数据self.table.detach('I001')# move方法把上面隐藏的第一行数据重新移动到指定的位置重新显示self.table.move('I001','', 1)if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

使用exists()方法判断item是否存在

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)# exists()方法判断item是否存在print("item是否存在:" + str(self.table.exists('I001')))print("item是否存在:" + str(self.table.exists('I0012')))if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

运行结果:

item是否存在:True
item是否存在:False

使用bbox()方法返回指定item的边界框

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)self.table.bind('<<TreeviewSelect>>', self.select)def select(self, event):# bbox()返回指定item的边界框print('选择的是:' + str(event.widget.selection())) #event.widget获取Treeview对象print('边界框为:' + str(self.table.bbox(event.widget.selection(), column=1)))return "break"if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

运行结果为:

选择的是:('I001',)
边界框为:(401, 25, 200, 40)

使用identify()/identify_row()/identify_column()/identify_region()/identify_element()方法返回指定组件的描述)

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):super().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条xscroll = Scrollbar(self, orient=HORIZONTAL)yscroll = Scrollbar(self, orient=VERTICAL)xscroll.pack(side=BOTTOM, fill=X)yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=xscroll.set,     # x轴滚动条yscrollcommand=yscroll.set      # y轴滚动条)xscroll.config(command=self.table.xview)yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for data in tableValues:self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data)# 鼠标单击触发self.table.bind('<ButtonRelease-1>', self.select)def select(self, event):# identify()返回指定组件的描述x = event.xy = event.yprint('选择的是:' + str(event.widget.selection()))  # event.widget获取Treeview对象print('鼠标单击的x坐标:'+ str(x))print('鼠标单击的Y坐标:' + str(y))print('区域描述为:' + str(self.table.identify('region', x, y)))print('项目描述为:' + str(self.table.identify('item', x, y)))print('列描述为:' + str(self.table.identify('column', x, y)))print('行描述为:' + str(self.table.identify('row', x, y)))print('要素描述为:' + str(self.table.identify('element', x, y)))print('位置y的item的id:' + str(self.table.identify_row(y)))print('位置x的单元格的数据列标识符:' + str(self.table.identify_column(x)))# 等同 self.table.identify('region', x, y)print('xy位置的区域:' + str(self.table.identify_region(x, y)))# 等同 self.table.identify('item', x, y)print('xy位置的要素:' +str(self.table.identify_element(x, y)))return "break"if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

鼠标单击第一行第二列后执行结果:

选择的是:('I001',)
鼠标单击的x坐标:297
鼠标单击的Y坐标:37
区域描述为:cell
项目描述为:I001
列描述为:#1
行描述为:I001
要素描述为:text
位置y的item的id:I001
位置x的单元格的数据列标识符:#1
xy位置的区域:cell
xy位置的要素:text

创建一个可编辑单元格的表格

from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTkclass MyTable(ttk.Frame):def __init__(self, master):self.master = mastersuper().__init__(master)self.pack()              #frame加入roottableColumns = ['序号', '权限', '用户', '密码']tableValues = [["1", "0", "user1", "password1"],["2", "1", "user2", "password2"],["3", "1", "user3", "password3"],["4", "2", "user4", "password4"],["5", "2", "user5", "password5"],["6", "3", "user4", "password6"],["7", "2", "user7", "password7"],["8", "2", "user8", "password8"],["9", "1", "user9", "password9"]]# 设置滚动条self.xscroll = Scrollbar(self, orient=HORIZONTAL, command=self.on_X_ScrollCommand)self.yscroll = Scrollbar(self, orient=VERTICAL, command=self.on_Y_ScrollCommand)self.xscroll.pack(side=BOTTOM, fill=X)self.yscroll.pack(side=RIGHT, fill=Y)self.table = ttk.Treeview(master=self,                    # 父容器columns=tableColumns,           # 列标识符列表height=30,                      # 表格显示的行数show='tree headings',           # 隐藏首列style='Treeview',               # 样式xscrollcommand=self.xscroll.set,     # x轴滚动条yscrollcommand=self.yscroll.set      # y轴滚动条)#self.xscroll.config(command=self.table.xview)#self.yscroll.config(command=self.table.yview)self.table.pack()  #TreeView加入frameself.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列"))                   # 设置#0列表头for i in range(len(tableColumns)):self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True)                                           # 设置列style = ttk.Style(master)style.configure('Treeview', rowheight=40)self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))for i, data in enumerate(tableValues):self.table.insert('', 'end', text="这里是头像", image=self.image,  value=data, tags=str(i))self.entry = tk.Entry(self, highlightthickness=1, bg='#F3F3F4', textvariable='')self.entry.bind("<FocusIn>", self.on_FocusIn)self.entry.bind("<FocusOut>", self.on_FocusOut)self.table.bind("<Double-1>",self.on_Double_1)self.table.bind("<MouseWheel>", self.on_MouseWheel)self.entry.bind("<Return>", self.on_Return)# 焦点在输入条时触发def on_FocusIn(self, event):pass# 焦点离开输入条时触发def on_FocusOut(self, event):text = self.entry.get()    # 获取输入条内容self.table.set(self.row, self.column, text) # 表格数据设置为输入条内容self.entry.place_forget()  # 隐藏输入条#self.xscroll.pack(side=BOTTOM, fill=X)#self.yscroll.pack(side=RIGHT, fill=Y)# 鼠标左键双击触发def on_Double_1(self, event):if str(event.widget) == ".!mytable.!treeview":  # 双击触发的是否为表格table = event.widgetfor item in table.selection():              # 取消表格选取table.selection_remove(item)self.row = table.identify_row(event.y)         # 点击的行self.column = table.identify_column(event.x)   # 点击的列col = int(str(table.identify_column(event.x)).replace('#', ''))  # 列号text = table.item(self.row, 'value')[col - 1]  # 单元格内容x = table.bbox(self.row, column=col - 1)[0]    # 单元格x坐标y = table.bbox(self.row, column=col - 1)[1]    # 单元格y坐标width = table.bbox(self.row, column=col - 1)[2]  # 单元格宽度height = table.bbox(self.row, column=col - 1)[3] # 单元格高度self.entry.focus_set()  # 输入条获取焦点self.entry.delete(0, END)  # 清除输入条中的内容self.entry.place(x=x, y=y, width=width, height=height)  # 设置输入条位置及长宽self.entry.insert(0, text)  # 输入条插入内容# 鼠标滚轮触发def on_MouseWheel(self, event):if self.entry.winfo_viewable()==1:  #如果输入条可见text = self.entry.get()  # 获取输入条内容self.table.set(self.row, self.column, text)  # 表格数据设置为输入条内容self.entry.place_forget()  # 隐藏输入条# 回车键触发def on_Return(self, event):if self.entry.winfo_viewable() == 1:  # 如果输入条可见self.entry.place_forget()  # 隐藏输入条text = self.entry.get()  # 获取输入条内容self.table.set(self.row, self.column, text)  # 表格数据设置为输入条内容# X轴滚动条拖动触发def on_X_ScrollCommand(self, *xx):if self.entry.winfo_viewable() == 1:  # 如果输入条可见text = self.entry.get()  # 获取输入条内容self.table.set(self.row, self.column, text)  # 表格数据设置为输入条内容self.entry.place_forget()  # 隐藏输入条self.table.xview(*xx)          # 表格横向滚动# Y轴滚动条拖动触发def on_Y_ScrollCommand(self, *xx):if self.entry.winfo_viewable() == 1:  # 如果输入条可见text = self.entry.get()  # 获取输入条内容self.table.set(self.row, self.column, text)  # 表格数据设置为输入条内容self.entry.place_forget()  # 隐藏输入条self.table.yview(*xx)          # 表格纵向滚动if __name__ == '__main__':root = tk.Tk()root.geometry('800x300')root.title("TreeView演示")MyTable(root)root.mainloop()

【Tkinter TreeView】相关推荐

  1. 【tkinter 专栏】专栏前言

    文章目录 前言 本章内容导图 1. tkinter 工具及特点 2. 为什么使用 Python 进行 GUI 设计? 2.1 Python 可以做什么 2.2 使用 tkinter 可以干什么? 3. ...

  2. python编程入门经典实例-编程语言入门经典100例【Python版】

    无论学习哪门计算机语言,只要把100例中绝大部分题目都做一遍,就基本掌握该语言的语法了. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? #Filena ...

  3. ZH奶酪:编程语言入门经典100例【Python版】

    无论学习哪门计算机语言,只要把100例中绝大部分题目都做一遍,就基本掌握该语言的语法了. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? #Filena ...

  4. python精彩编程200例-编程语言入门经典100例【Python版】

    无论学习哪门计算机语言,只要把100例中绝大部分题目都做一遍,就基本掌握该语言的语法了. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? #Filena ...

  5. python3入门经典100例-ZH奶酪:编程语言入门经典100例【Python版】

    无论学习哪门计算机语言,只要把100例中绝大部分题目都做一遍,就基本掌握该语言的语法了. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? #Filena ...

  6. python编程400例_ZH奶酪:编程语言入门经典100例【Python版】

    无论学习哪门计算机语言,只要把100例中绝大部分题目都做一遍,就基本掌握该语言的语法了. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? #Filena ...

  7. 【tkinter组件专栏】LabelFrame:规划布局frame的小老弟

    文章目录 一.组件简介 二.运用实例 1. LabelFrame基操 三.参数方法 1. 参数汇总 一.组件简介 光从名字上来看,我们就知道LabelFrame与Frame组件之间之间有着" ...

  8. [Python]Tkinter+Numpy+Matplotlib 进行的简单交互+曲线拟合+图像绘制【已改进】

    用Python的Tkinter.Numpy.Matplotlib库对曲线拟合的一点探索[已改进] 需要用到的库:如标题 三大方面 功能 需要的库 一. 简单交互,获取函数或者样本点 tkinter[p ...

  9. 【tkinter】的使用详解,做一个简单实用的万能可视化界面!

    文章目录 一.tkinter类介绍 二.在例子中学会用法! 1.一个简单的开始 2.学会使用button 3.Entry窗口部件 1.简单使用 2.动态改变entry内部的值 4.Text窗口部件 ( ...

最新文章

  1. 几个不错的网页载入页面
  2. 【循序渐进学Python】7.面向对象的核心——类型(上)
  3. 全国计算机考试vb考试知识点汇总,全国计算机二级考试VB机试常见题型汇总
  4. B-treeB+tree数据库索引原理
  5. Eclipse下载及安装hibernate插件
  6. java.sql.SQLException: Value'0000-00-00'异常解决办法
  7. mysql出现error 2003_mysql启动时出现ERROR 2003 (HY000)问题的解决方法
  8. Git常见问题及报错
  9. 排名算法(三)--排序学习
  10. 计算机基础知识ppt操作题,计算机一级ppt操作题
  11. 第四届全国大学生GIS应用技能大赛开发题答案(非官方)
  12. Shell变量(二)
  13. n1服务器系统和小钢炮,教你N1小钢炮系统设置中其他一些应用和服务器的设置的相关方法教程...
  14. 第十七章、区网控制者: Proxy 服务器
  15. 联想服务器bios查看网卡信息,如何通过BIOS检查确认硬盘信息可被正常识别
  16. 怎么在苹果手机计算机上打字,苹果手机怎样设置打字是中文的
  17. AP发现AC过程——CAPWAP协议详解
  18. 深入浅出通信原理连载41-70(Python代码版)
  19. 初中计算机上机操作试题,初中信息技术考试word操作题
  20. 图像拼接小实验开发日志和笔记

热门文章

  1. 用Mathematica画红心
  2. 【瞎扯】树上差分的基本思路
  3. 不忘初心,扬帆起航!
  4. 敢问路在何方---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十三)
  5. 【Linux系统】stat、lstat函数
  6. 小程序云开发详解(附开源云开发项目)
  7. zcmu 1376: 天天酷跑
  8. 如何看待ChatGPT
  9. 2022年熔化焊接与热切割考试练习题及模拟考试
  10. 2055. Plates Between Candles