目录

一、前言

二、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,则返回标题选项值的字典。

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

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

column(columnoption=None**kw)

查询或设定指定列的选项

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

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

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


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给出的点下返回指定组件的描述,如果在该位置没有这样的组件,则返回空字符串


identify_row(y)

返回位置为y的item的ID

identify_column(x)

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

树列的ID为#0

identify_region(xy)

Tk 8.6.

返回一个

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)

查询或修改树视图的垂直位置

option

text

显示在列标题中的文本

image

要显示在列标题右侧的图像

anchor

指定标题文本的对齐方式

command

当按下标题标签时要调用的回调

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

Python tkinter Treeview效果 tkinter treeview insert_tkinter

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

Python tkinter Treeview效果 tkinter treeview insert_python_02

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

Python tkinter Treeview效果 tkinter treeview insert_标识符_03

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

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

Python tkinter Treeview效果 tkinter treeview insert_ide_04

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

Python tkinter Treeview效果 tkinter treeview insert_tkinter_05

运行结果为:

选择的是:('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()

Python tkinter Treeview效果 tkinter treeview insert_标识符_06

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

Python tkinter Treeview效果 tkinter treeview insert_ide_07

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

Python tkinter Treeview效果 tkinter treeview insert_treeview_08

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

Python tkinter Treeview效果 tkinter treeview insert_treeview_09

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

选则的行在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()

Python tkinter Treeview效果 tkinter treeview insert_tkinter_10

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

Python tkinter Treeview效果 tkinter treeview insert_treeview_11

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

Python tkinter Treeview效果 tkinter treeview insert_treeview_12

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

Python tkinter Treeview效果 tkinter treeview insert_ide_13

 运行结果为:

选择的是:('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()