目录
一、前言
二、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中常用的方法
方法 | 描述及返回值 |
| 查询或设定指定列的标题选项。 如果指定了选项,则返回该选项的值。 否则,将选项设置为相应的值 |
| 查询或设定指定列的选项 column是列标识符 如果指定了选项,则返回该选项的值 否则,将选项设置为相应的值 |
| 返回属于item的子元素列表 如果item未指定,则返回根目录的item |
| 用newchildren替换item的子元素 不指定newchildren会导致分离item的子元素 一般用于树形结构中 |
| 删除所有指定items及其所有子item 根item目不能被删除 |
| 在树中断开(隐藏)items及子item 重新显示可以move()方法 |
| 将item移动到parent下的列表中的index位置 如果大于或等于子节点的数量,则将其移动到最后 如果项目被分离,它将被重新添加 |
| 如果树中存在指定的item,则返回True |
| 如果指定了item,则将焦点项设置为item 否则,返回当前的焦点项 若无则返回空值 使用focus()方法并不会让获得focus的item被高亮显示 如果要高亮显示使用selection_set()方法 |
| 返回指定item的边界框(x, y, width, height) 如果指定了column,则返回该单元格的边界框 如果项目是不可见的(例如它是一个关闭item的子代或滚动出屏幕),返回一个空字符串 |
| 在x和y给出的点下返回指定组件的描述,如果在该位置没有这样的组件,则返回空字符串 |
| 返回位置为y的item的ID |
| 返回位置x的单元格的数据列标识符 树列的ID为#0 |
Tk 8.6. | 返回一个 |
Tk 8.6. | 返回位置为x, y的元素 |
| 返回子item在父items的列表中的i整数索引 |
| 创建新item并返回新创建item的标识符 parent是父item的ID,若为空字符串则用于创建新根item串 Index是一个整数,或“end”,指定在父item列表中插入新item的位置 如果index小于或等于0,则在开始处插入新节点;如果index大于或等于当前子节点的数量,则将其插入到末尾 iid它被用作item标识符;Iid不能已经存在于树中。否则,将生成一个新的惟一标识符,不指定可自动生成 **kw有关可用列表,请参阅上面TreeView的item选项 |
| 查询或修改指定item的选项 如果指定了选项,则返回该选项的值 否则,将选项设置为kw给出的相应值 |
| 返回下一个与item同级的item的标识符 |
| 返回item的父元素的ID |
| 返回item的前一个同级的标识符 |
| Treeview.move()的别名 |
| 设置item是可见的。 将item的所有祖先open选项设置为True,并在必要时滚动Treeview,以便item位于树的可见部分中 |
| 如果未指定selop,则返回选中的item,列表形式 否则,将按照以下选择方法进行操作 |
| Items成为新的选择 在3.6版更改,项可以作为单独的参数传递,而不只是作为单个元组 |
| 向选择items中添加item 在3.6版更改,项可以作为单独的参数传递,而不只是作为单个元组 |
| 从选择items中删除item 在3.6版更改,项可以作为单独的参数传递,而不只是作为单个元组 |
| 切换items中每个item的选择状态 在3.6版更改,item可以作为单独的参数传递,而不只是作为单个元组 |
| 返回指定item的列/值对字典 只有item和column,返回指定column的value当前值。 item和column和value同时使用,则修改item中指定的列的value |
| 将给定事件序列的回调绑定到标记tagname 当事件被交付给item时,将调用item的每个标签选项的回调 |
| 查询或修改指定标记名的选项 如果指定了option,则为指定的标记名返回该选项的值。否则,将item设置为给定标记名的相应值 如果没有给出kw,则返回tagname的item设置的字典 |
Tk 8.6. | 若指定了item,则根据指定的item是否具有给定的标记名返回True或False 否则,返回具有指定标记的所有item的列表 |
| 查询或修改树视图的水平位置 |
| 查询或修改树视图的垂直位置 |
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()
使用get_children()方法
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for data in tableValues:
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data)
# get_children用法
print('根目录所有items:' + str(self.table.get_children()))
print(self.table.get_children('I001'))
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
输出结果:
根目录所有子元素列表:('I001', 'I002', 'I003', 'I004', 'I005', 'I006', 'I007', 'I008', 'I009')
指定item所有子元素列表:()
使用focus() 获取 item
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for data in tableValues:
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data)
#使用focus()方法并不会让获得focus的item被高亮显示;如果要高亮显示使用selection_set()方法
self.table.focus('I001')
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
使用see()方法使item位于树的可见部分
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for data in tableValues:
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data)
# 将item的所有祖先open选项设置为True,并在必要时滚动Treeview,以便item位于树的可见部分中
self.table.see('I009')
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
运行结果可以看到表格滚动到最后一条数据,数据为可视
使用selection_set()方法设置新选择的item/items
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for data in tableValues:
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data)
self.table.selection_set('I003')
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
使用selection()方法获取item/items
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for data in tableValues:
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data)
# 当表格选择改变触发 自定义的方法
self.table.bind('<<TreeviewSelect>>', self.selection)
def selection(self, event):
# selection()方法可获取item或items
print('选择的是:' + str(event.widget.selection())) #event.widget获取Treeview对象
return "break"
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
运行结果为:
选择的是:('I001', 'I002', 'I003')
使用selection_add()追加选择
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for data in tableValues:
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data)
# 选设定新的选则
self.table.selection_set('I003')
# 追加两个选择
self.table.selection_add('I001', 'I004')
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
使用selection_remove()把指定的item从选择中移除
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for data in tableValues:
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data)
# 设定新的items为选择
self.table.selection_set('I003')
# 添加新的items为选择
self.table.selection_add('I001', 'I004')
# 移除选择中的items
self.table.selection_remove('I001')
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
使用set()方法返回或修改item值
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for data in tableValues:
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data)
# 返回item所有数据字典
print('item所有数据字典为:' + str(self.table.set('I001')))
# 返回item指定列的数据字典
print('item指定列的数据字典为:' + str(self.table.set('I001', column='#3')))
# 修改item指定列的数据
self.table.set('I001', column='#3', value='admin')
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
使用table.tag_has()/table.tag_configure()/table.tag_bind()
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for i, data in enumerate(tableValues):
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data, tags=str(i))
print('item中是否含有该tag:' + str(self.table.tag_has('0', 'I001')))
print('含有该tag的items:' + str(self.table.tag_has('0')))
print('tagname的选项/属性数据字典:' + str(self.table.tag_configure('1')))
print('tagname的指定选项值:' + str(self.table.tag_configure('1', option='anchor')))
# 对tagname使用kw中的参数设置有关属性
self.table.tag_configure('1', text='你好')
print('tagname的指定选项值:' + str(self.table.tag_configure('1')))
self.table.tag_bind('1', '<Double-1>', callback=self.bind())
def bind(self):
print('指定事件绑定')
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
执行后的结果为:
item中是否含有该tag:True
含有该tag的items:('I001',)
tagname的选项/属性数据字典:{'text': '', 'image': '', 'anchor': '', 'background': '', 'foreground': '', 'font': ''}
tagname的指定选项值:
tagname的指定选项值:{'text': '你好', 'image': '', 'anchor': '', 'background': '', 'foreground': '', 'font': ''}
指定事件绑定
使用next()/parent()/prev()方法
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for i, data in enumerate(tableValues):
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data, tags=str(i))
print('返回下一个与item同级的item的标识符:' + str(self.table.next('I003')))
print('返回item的父元素的ID:' + str(self.table.parent('I003')))
print('返回item的前一个同级的标识符:' + str(self.table.prev('I003')))
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
执行后的结果为:
返回下一个与item同级的item的标识符:I004
返回item的父元素的ID:
返回item的前一个同级的标识符:I002
使用index()方法返回item在items列表中的整数索引
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for data in tableValues:
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data)
self.table.bind('<<TreeviewSelect>>', self.select)
def select(self, event):
print('选则的行在items的列表中的整数索引:' + str(self.table.index(event.widget.selection())))
return "break"
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
选则第二行数据执行结果:
选则的行在items的列表中的整数索引:1
使用delete()方法删除第一行数据
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for data in tableValues:
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data)
# delete用法 删除第一个item也就是第一行数据
self.table.delete('I001')
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
使用detach()方法隐藏第一行数据
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for data in tableValues:
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data)
# detach用法隐藏第一行数据
self.table.detach('I001')
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
使用move()方法使隐藏第一行数据重新显示在第二行
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for data in tableValues:
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data)
# detach方法隐藏第一行数据
self.table.detach('I001')
# move方法把上面隐藏的第一行数据重新移动到指定的位置重新显示
self.table.move('I001','', 1)
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
使用exists()方法判断item是否存在
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for data in tableValues:
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data)
# exists()方法判断item是否存在
print("item是否存在:" + str(self.table.exists('I001')))
print("item是否存在:" + str(self.table.exists('I0012')))
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
运行结果:
item是否存在:True
item是否存在:False
使用bbox()方法返回指定item的边界框
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for data in tableValues:
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data)
self.table.bind('<<TreeviewSelect>>', self.select)
def select(self, event):
# bbox()返回指定item的边界框
print('选择的是:' + str(event.widget.selection())) #event.widget获取Treeview对象
print('边界框为:' + str(self.table.bbox(event.widget.selection(), column=1)))
return "break"
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
运行结果为:
选择的是:('I001',)
边界框为:(401, 25, 200, 40)
使用identify()/identify_row()/identify_column()/identify_region()/identify_element()方法返回指定组件的描述)
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
xscroll = Scrollbar(self, orient=HORIZONTAL)
yscroll = Scrollbar(self, orient=VERTICAL)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=xscroll.set, # x轴滚动条
yscrollcommand=yscroll.set # y轴滚动条
)
xscroll.config(command=self.table.xview)
yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for data in tableValues:
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data)
# 鼠标单击触发
self.table.bind('<ButtonRelease-1>', self.select)
def select(self, event):
# identify()返回指定组件的描述
x = event.x
y = event.y
print('选择的是:' + str(event.widget.selection())) # event.widget获取Treeview对象
print('鼠标单击的x坐标:'+ str(x))
print('鼠标单击的Y坐标:' + str(y))
print('区域描述为:' + str(self.table.identify('region', x, y)))
print('项目描述为:' + str(self.table.identify('item', x, y)))
print('列描述为:' + str(self.table.identify('column', x, y)))
print('行描述为:' + str(self.table.identify('row', x, y)))
print('要素描述为:' + str(self.table.identify('element', x, y)))
print('位置y的item的id:' + str(self.table.identify_row(y)))
print('位置x的单元格的数据列标识符:' + str(self.table.identify_column(x)))
# 等同 self.table.identify('region', x, y)
print('xy位置的区域:' + str(self.table.identify_region(x, y)))
# 等同 self.table.identify('item', x, y)
print('xy位置的要素:' +str(self.table.identify_element(x, y)))
return "break"
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()
鼠标单击第一行第二列后执行结果:
选择的是:('I001',)
鼠标单击的x坐标:297
鼠标单击的Y坐标:37
区域描述为:cell
项目描述为:I001
列描述为:#1
行描述为:I001
要素描述为:text
位置y的item的id:I001
位置x的单元格的数据列标识符:#1
xy位置的区域:cell
xy位置的要素:text
创建一个可编辑单元格的表格
from tkinter import *
import tkinter.ttk as ttk
import tkinter as tk
from PIL import Image, ImageTk
class MyTable(ttk.Frame):
def __init__(self, master):
self.master = master
super().__init__(master)
self.pack() #frame加入root
tableColumns = ['序号', '权限', '用户', '密码']
tableValues = [
["1", "0", "user1", "password1"],
["2", "1", "user2", "password2"],
["3", "1", "user3", "password3"],
["4", "2", "user4", "password4"],
["5", "2", "user5", "password5"],
["6", "3", "user4", "password6"],
["7", "2", "user7", "password7"],
["8", "2", "user8", "password8"],
["9", "1", "user9", "password9"]
]
# 设置滚动条
self.xscroll = Scrollbar(self, orient=HORIZONTAL, command=self.on_X_ScrollCommand)
self.yscroll = Scrollbar(self, orient=VERTICAL, command=self.on_Y_ScrollCommand)
self.xscroll.pack(side=BOTTOM, fill=X)
self.yscroll.pack(side=RIGHT, fill=Y)
self.table = ttk.Treeview(
master=self, # 父容器
columns=tableColumns, # 列标识符列表
height=30, # 表格显示的行数
show='tree headings', # 隐藏首列
style='Treeview', # 样式
xscrollcommand=self.xscroll.set, # x轴滚动条
yscrollcommand=self.yscroll.set # y轴滚动条
)
#self.xscroll.config(command=self.table.xview)
#self.yscroll.config(command=self.table.yview)
self.table.pack() #TreeView加入frame
self.table.heading(column="#0", text="用户头像", anchor=CENTER, command=lambda: print("您点击了“用户头像”列")) # 设置#0列表头
for i in range(len(tableColumns)):
self.table.heading(column=tableColumns[i], text=tableColumns[i], anchor=CENTER, command=lambda: print(tableColumns[i])) # 设置除#0列以外的表头
self.table.column(tableColumns[i], minwidth=100, anchor=CENTER ,stretch=True) # 设置列
style = ttk.Style(master)
style.configure('Treeview', rowheight=40)
self.image = ImageTk.PhotoImage(Image.open("./butterfly.png"))
for i, data in enumerate(tableValues):
self.table.insert('', 'end', text="这里是头像", image=self.image, value=data, tags=str(i))
self.entry = tk.Entry(self, highlightthickness=1, bg='#F3F3F4', textvariable='')
self.entry.bind("<FocusIn>", self.on_FocusIn)
self.entry.bind("<FocusOut>", self.on_FocusOut)
self.table.bind("<Double-1>",self.on_Double_1)
self.table.bind("<MouseWheel>", self.on_MouseWheel)
self.entry.bind("<Return>", self.on_Return)
# 焦点在输入条时触发
def on_FocusIn(self, event):
pass
# 焦点离开输入条时触发
def on_FocusOut(self, event):
text = self.entry.get() # 获取输入条内容
self.table.set(self.row, self.column, text) # 表格数据设置为输入条内容
self.entry.place_forget() # 隐藏输入条
#self.xscroll.pack(side=BOTTOM, fill=X)
#self.yscroll.pack(side=RIGHT, fill=Y)
# 鼠标左键双击触发
def on_Double_1(self, event):
if str(event.widget) == ".!mytable.!treeview": # 双击触发的是否为表格
table = event.widget
for item in table.selection(): # 取消表格选取
table.selection_remove(item)
self.row = table.identify_row(event.y) # 点击的行
self.column = table.identify_column(event.x) # 点击的列
col = int(str(table.identify_column(event.x)).replace('#', '')) # 列号
text = table.item(self.row, 'value')[col - 1] # 单元格内容
x = table.bbox(self.row, column=col - 1)[0] # 单元格x坐标
y = table.bbox(self.row, column=col - 1)[1] # 单元格y坐标
width = table.bbox(self.row, column=col - 1)[2] # 单元格宽度
height = table.bbox(self.row, column=col - 1)[3] # 单元格高度
self.entry.focus_set() # 输入条获取焦点
self.entry.delete(0, END) # 清除输入条中的内容
self.entry.place(x=x, y=y, width=width, height=height) # 设置输入条位置及长宽
self.entry.insert(0, text) # 输入条插入内容
# 鼠标滚轮触发
def on_MouseWheel(self, event):
if self.entry.winfo_viewable()==1: #如果输入条可见
text = self.entry.get() # 获取输入条内容
self.table.set(self.row, self.column, text) # 表格数据设置为输入条内容
self.entry.place_forget() # 隐藏输入条
# 回车键触发
def on_Return(self, event):
if self.entry.winfo_viewable() == 1: # 如果输入条可见
self.entry.place_forget() # 隐藏输入条
text = self.entry.get() # 获取输入条内容
self.table.set(self.row, self.column, text) # 表格数据设置为输入条内容
# X轴滚动条拖动触发
def on_X_ScrollCommand(self, *xx):
if self.entry.winfo_viewable() == 1: # 如果输入条可见
text = self.entry.get() # 获取输入条内容
self.table.set(self.row, self.column, text) # 表格数据设置为输入条内容
self.entry.place_forget() # 隐藏输入条
self.table.xview(*xx) # 表格横向滚动
# Y轴滚动条拖动触发
def on_Y_ScrollCommand(self, *xx):
if self.entry.winfo_viewable() == 1: # 如果输入条可见
text = self.entry.get() # 获取输入条内容
self.table.set(self.row, self.column, text) # 表格数据设置为输入条内容
self.entry.place_forget() # 隐藏输入条
self.table.yview(*xx) # 表格纵向滚动
if __name__ == '__main__':
root = tk.Tk()
root.geometry('800x300')
root.title("TreeView演示")
MyTable(root)
root.mainloop()