前言
ttk.Treeview 是 Tkinter 模块中的一个组件,它提供了一个可用于显示层次结构数据的树状列表。它具有以下特点和功能:
- 显示层次结构:ttk.Treeview支持以树状结构显示数据。每个节点可以有子节点,从而形成层次结构。用户可以展开或折叠节点来查看或隐藏子节点。
- 列表视图:ttk.Treeview 还支持以列表形式显示数据,类似于表格。每列可以定义不同的字段,并显示相应的数据。
- 多列支持:你可以通过在 ttk.Treeview 初始化时指定 columns 参数来创建多个列。每列可以有自己的标题和宽度。
- 数据绑定:ttk.Treeview 可以与数据源绑定,使数据的插入、删除和编辑更加方便。你可以使用 insert 方法向ttk.Treeview 中插入数据,使用 delete 方法删除数据,使用 set 方法更新数据。
- 样式定制:你可以通过设置样式、字体、颜色等来定制 ttk.Treeview的外观。也可以为不同的行、单元格设置样式或标签,以实现自定义效果。
- 事件处理:你可以为 ttk.Treeview组件绑定各种事件处理程序,例如单击、双击、选择变化等。通过处理这些事件,你可以响应用户的操作,并执行相关的逻辑。
ttk.Treeview 是 Tkinter 中非常强大和灵活的组件,可用于创建各种复杂的层次结构列表和数据展示界面。你可以根据自己的需求来配置和使用 ttk.Treeview,以实现定制的树状列表功能。
一、方法
import tkinter as tk
from tkinter import ttk
class GUI:
def __init__(self):
self.root = tk.Tk()
self.root.title('演示窗口')
self.root.geometry("600x380+1100+150")
self.interface()
def interface(self):
""""界面编写位置"""
pass
if __name__ == '__main__':
a = GUI()
a.root.mainloop()
1、创建列表和数据并设置样式
def interface(self):
""""界面编写位置"""
# (1)创建样式
style = ttk.Style()
style.configure("Treeview", rowheight=20) # 设置行高
style.configure("Treeview.Heading", font=('Arial', 11, 'bold')) # 设置表头字体
# (2)创建 Treeview 控件,设置高度为10行
self.tree = ttk.Treeview(self.root, height=10, style="Treeview")
self.tree.grid(row=0, column=0, rowspan=10, columnspan=10, padx=60)
# (3)定义列名
self.tree["columns"] = ("Name", "Age", "City")
# (4)设置列的标题名称,anchor可设置对其方式:居中(center)/左对齐(w)/右对齐(e),无anchor参数时,标题名称默认居中
self.tree.heading("#0", text="序号", anchor="w")
self.tree.heading("Name", text="姓名")
self.tree.heading("Age", text="年龄")
self.tree.heading("City", text="城市")
# (5)设置列宽度(像素),无anchor参数时,列表中的数据除(#0)外其余都是默认左对齐
self.tree.column("#0", width=50)
self.tree.column("Name", width=100, anchor="center")
self.tree.column("Age", width=90, anchor="center")
self.tree.column("City", width=150, anchor="center")
# (6)插入默认数据
self.tree.insert("", tk.END, text="1", values=("张三", "25", "深圳"))
解释:
- 创建样式:首先创建了一个ttk.Style()对象,并通过configure方法设置了列表的行高和表头字体样式。
- 创建 Treeview 控件:调用 ttk.Treeview 构造函数创建了一个名为 self.tree 的 Treeview控件,并将其放置在父窗口 self.root 的网格布局中,位置为第一行/列,跨越10个行/列,左右留有60像素的边距。
- 定义列名:通过设置 self.tree[“columns”] 属性,定义了一个包含三个列的列表,列名分别为 “Name”、“Age” 和"City"。
- 设置列的标题名称:通过调用 self.tree.heading 方法,设置了每个列的标题名称。其中,“#0” 是默认的索引列,标题文本为"序号",对齐方式为左对齐;“Name” 列的标题为 “姓名”,没有指定对齐方式,默认居中对齐;“Age” 列的标题为 “年龄”,没有指定对齐方式,默认居中对齐;“City” 列的标题为 “城市”,没有指定对齐方式,默认居中对齐。
- 设置列宽度:通过调用 self.tree.column 方法,设置了每个列的宽度。“#0” 列宽度为 50 像素,“Name” 列宽度为100 像素,“Age” 列宽度为 90 像素,“City” 列宽度为 150 像素。在数据列中,除了 "#0"列是默认左对齐外,其他列的数据默认居中对齐。
- 插入默认数据:通过调用 self.tree.insert 方法,在 Treeview 中插入了一条数据行。这里插入了一个索引为 "1"的数据行,该行包含了姓名、年龄和城市信息。
2、获取列表数据
def interface(self):
""""界面编写位置"""
# (1)创建样式......
# (2)创建 Treeview 控件......
# (3)定义列名......
# (4)设置列的标题名称......
# (5)设置列宽度(像素)......
# (6)插入默认数据
self.tree.insert("", tk.END, text="1", values=("张三", "25", "深圳"))
self.tree.insert("", tk.END, text="2", values=("王五", "30", "上海"))
# 创建按钮
self.Button0 = tk.Button(self.root, text="获取数据", command=self.get_data)
self.Button0.grid(row=11, column=0, ipadx=10)
self.Button1 = tk.Button(self.root, text="获取全部数据", command=self.get_whole_data)
self.Button1.grid(row=11, column=2, ipadx=10)
# 添加文本框
self.Label0 = tk.Label(self.root, text="打印日志:")
self.Label0.grid(row=12, column=0, padx=60)
self.w1 = tk.Text(self.root, width=50, height=5)
self.w1.grid(row=13, column=0, columnspan=5, padx=60)
def get_data(self):
'''获取选中数据'''
selected_items = self.tree.selection()
if selected_items:
for item in selected_items:
row_data = self.tree.item(item)['values']
self.w1.insert("1.0", f"Selected Row Data:{row_data}\n")
else:
self.w1.insert("1.0", "未选中数据\n")
def get_whole_data(self):
'''获取全部数据'''
rows = self.tree.get_children() # 获取所有的行ID
# 遍历每一行
for row in rows:
# 获取该行的数据字典
data = self.tree.item(row)
self.w1.insert("1.0", f"{data['values']}\n")
3、添加、编辑、删除
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
class GUI:
def __init__(self):
self.root = tk.Tk()
self.root.title('演示窗口')
self.root.geometry("600x380+1100+150")
self.interface()
def interface(self):
""""界面编写位置"""
# (1)创建 Treeview 控件, 设置高度为10行
self.tree = ttk.Treeview(self.root, height=10)
self.tree.grid(rowspan=10, columnspan=10, padx=30)
# (2)定义列名
self.tree["columns"] = ("Name", "Age", "City")
# (3)设置列的标题名称
self.tree.heading("#0", text="序号", anchor="w")
self.tree.heading("Name", text="姓名")
self.tree.heading("Age", text="年龄")
self.tree.heading("City", text="城市")
# (4)设置列宽度(像素)
self.tree.column("#0", width=50)
self.tree.column("Name", width=100, anchor="center")
self.tree.column("Age", width=90, anchor="center")
self.tree.column("City", width=150, anchor="center")
# (5)插入默认数据
self.tree.insert("", tk.END, text="1", values=("张三", "25", "深圳"))
# 创建按钮
self.Button0 = tk.Button(self.root, text="添加", command=self.add_page)
self.Button0.grid(row=11, column=1, ipadx=10)
self.Button1 = tk.Button(self.root, text="编辑", command=self.edit_page)
self.Button1.grid(row=11, column=3, ipadx=10)
self.Button2 = tk.Button(self.root, text="删除", command=self.delete_item)
self.Button2.grid(row=11, column=5, ipadx=10)
def add_page(self):
self.Label0 = tk.Label(self.root, text="姓名")
self.Label0.grid(row=0, column=11)
self.entry00 = tk.StringVar()
self.entry0 = tk.Entry(self.root, textvariable=self.entry00, width=15)
self.entry0.grid(row=1, column=11)
self.Label1 = tk.Label(self.root, text="年龄")
self.Label1.grid(row=2, column=11)
self.entry01 = tk.StringVar()
self.entry1 = tk.Entry(self.root, textvariable=self.entry01, width=15)
self.entry1.grid(row=3, column=11)
self.Label02 = tk.Label(self.root, text="城市")
self.Label02.grid(row=4, column=11)
self.entry02 = tk.StringVar()
self.entry2 = tk.Entry(self.root, textvariable=self.entry02, width=15)
self.entry2.grid(row=5, column=11)
self.Button_1 = tk.Button(self.root, text="确定", command=self.add_item)
self.Button_1.grid(row=6, column=11, ipadx=10)
def add_item(self):
'''添加数据'''
rows = self.tree.get_children() # 获取所有的行ID
name = self.entry00.get()
age = self.entry01.get()
city = self.entry02.get()
if name and age and city:
self.tree.insert("", tk.END, text=len(rows)+1, values=(name, age, city))
else:
self.Button_1.bind("<Button-1>", self.window("输入框不可以为空"))
def edit_page(self):
selected_items = self.tree.selection()
if selected_items:
for item in selected_items:
row_data = self.tree.item(item)['values']
self.Label0 = tk.Label(self.root, text="姓名")
self.Label0.grid(row=0, column=11)
self.entry00 = tk.StringVar()
self.entry00.set(row_data[0])
self.entry0 = tk.Entry(self.root, textvariable=self.entry00, width=15)
self.entry0.grid(row=1, column=11)
self.Label1 = tk.Label(self.root, text="年龄")
self.Label1.grid(row=2, column=11)
self.entry01 = tk.StringVar()
self.entry01.set(row_data[1])
self.entry1 = tk.Entry(self.root, textvariable=self.entry01, width=15)
self.entry1.grid(row=3, column=11)
self.Label02 = tk.Label(self.root, text="城市")
self.Label02.grid(row=4, column=11)
self.entry02 = tk.StringVar()
self.entry02.set(row_data[2])
self.entry2 = tk.Entry(self.root, textvariable=self.entry02, width=15)
self.entry2.grid(row=5, column=11)
self.Button_1 = tk.Button(self.root, text="确定", command=self.edit_item)
self.Button_1.grid(row=6, column=11, ipadx=10)
else:
self.Button1.bind("<Button-1>", self.window("未选中数据"))
def edit_item(self):
'''编辑数据'''
selected_item = self.tree.selection()
name = self.entry00.get()
age = self.entry01.get()
city = self.entry02.get()
if name and age and city:
self.tree.item(selected_item, values=(name, age, city))
else:
self.Button_1.bind("<Button-1>", self.window("输入框不可以为空"))
def delete_item(self):
'''删除数据'''
selected_item = self.tree.selection()
if selected_item:
self.tree.delete(selected_item)
else:
self.Button2.bind("<Button-1>", self.window("未选中数据"))
def window(e, text):
'''创建弹窗'''
messagebox.showinfo("提示", text)
if __name__ == '__main__':
a = GUI()
a.root.mainloop()
4、隐藏默认的索引列
def interface(self):
""""界面编写位置"""
# 创建 Treeview 控件;设置高度为10行;只显示列名行,隐藏索引列
self.tree = ttk.Treeview(self.root, height=10, show="headings")
self.tree.grid(row=0, column=0, rowspan=10, columnspan=10, padx=60)
# 定义列名
self.tree["columns"] = ("Name", "Age", "City")
# 设置列的标题名称
self.tree.heading("Name", text="姓名")
self.tree.heading("Age", text="年龄")
self.tree.heading("City", text="城市")
# 设置列宽度(像素)
self.tree.column("Name", width=100, anchor="center")
self.tree.column("Age", width=90, anchor="center")
self.tree.column("City", width=150, anchor="center")
# 插入默认数据
self.tree.insert("", tk.END, values=("张三", "25", "深圳"))
持续更新中…