使用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 ( column , option=None , **kw )

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

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

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

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

查询或设定指定列的选项

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

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

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

option
id 返回列名标识符;只读
anchor 指定列中的文本应如何相对于单元格对齐
minwidth 列的最小宽度,以像素为单位。
width 列的宽度,以像素为单位
stretch TreeView调整大小时是否调整列的宽度

get_children ( item=None ) 返回属于item的子元素列表
如果item未指定,则返回根目录的item
set_children ( item , *newchildren )

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

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

一般用于树形结构中

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

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

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

move ( item , parent , index )

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

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

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

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

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

否则,返回当前的焦点项

若无则返回空值

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

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

bbox ( item , column=None )

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

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

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

identify ( component , x , y )

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

component(部件)可选项目
region 区域
item 项目
column
row
element 要素

identify_row ( y ) 返回位置为y的item的ID
identify_column ( x )

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

树列的ID为#0

identify_region ( x , y )

Tk 8.6.

返回一个

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

identify_element ( x , y )

Tk 8.6.

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

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

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

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

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

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

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

item ( item , option=None , **kw )

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

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

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

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

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

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

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

tag_bind ( tagname , sequence=None , callback=None )

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

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

tag_configure ( tagname , option=None , **kw )

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

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

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

tag_has ( tagname , item=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):
     # 焦点离开输入条时触发
     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()
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、TreeView的引入 二、TreeView的属性 二、TreeView的创建 1.引入库 2.读入数据 总结 前言TreeView是它是用来展示树形结构或列表结构的一个UI控件;第一列用来表示树状结构,除第一列外后面几列的是列表结构一、TreeView的引入import tkinter.ttk as ttk二、TreeView的属性属性 描述 m
Treeview 组件是 ttk 模块的组件之一,它既可以作为树结构使用,也可以作为表格展示数据( tkinter 并没有表格控件)。 和常见的树装结构一样,当 Treeview 作为树使用时,非叶子节点可以展开和折叠。 本文将详细介绍 Treeview 作为表格和作为树的使用方法,并提供具有源码的示例。 tkinter Treeview 控件的使用方法 创建 Treeview 控件 Treeview 参数解读 作为表格使用 Treeview 作为树使用 Treeview Treeview 插入子节点
tkinter Treeview 可以实现类似table的表格效果,如果和滚动条结合就更加完美了。结果反复探讨,实现的方式如下 from tkinter import * from tkinter .ttk import Treeview window=Tk() window.geometry('200x450') cols = ("姓名", "IP地址") ybar=Scrollbar(window,orient='vertical') #竖直滚动条 tree= Treeview (window,sh
在stackoverflow中的 treeview 列排序中,用到get_children()函数,其返回的是 treeview 中的记录号. , treeview 中set(item,column,value)函数中,item是get_children()返回的记录号,column是 treeview 的列名,如果value为None,则返回,这个单元格的数值,如果value设置,则设置这个单元格的值。 # Python : 3.7 # phantomjs: phantomjs-2.1.1-windows # db: Python 自带的Sqlite,增加 tkinter .ttk 库 功能...
# 创建 Treeview tree = ttk. Treeview (root, columns=('col1', 'col2')) tree.heading('#', text='ID') tree.heading('col1', text='列1') tree.heading('col2', text='列2') tree.pack() # 插入数据 tree.insert('', 'end', text='1', values=('值1', '值2')) # 获取第一行的值 item_id = tree.get_children()[] values = tree.item(item_id)['values'] # 更新第一行的值 values = ('新值1', '新值2') tree.item(item_id, values=values) root.mainloop()