目录

一、前言

二、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"

styleTreeView的样式
xscrollcommand

X轴滚动条的绑定

yscrollcommandY轴滚动条的绑定

四、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列的宽度,以像素为单位
stretchTreeView调整大小时是否调整列的宽度

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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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或items
        print('选择的是:' + 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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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')
        # 移除选择中的items
        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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.x
        y = event.y
        print('选择的是:' + 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, ImageTk


class MyTable(ttk.Frame):

     def __init__(self, master):
        self.master = master
        super().__init__(master)
        self.pack()              #frame加入root
        tableColumns = ['序号', '权限', '用户', '密码']
        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加入frame

        self.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.widget
             for 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()

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐