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