在本文中,将介绍 Tkinter Treeview 树视图小部件以及如何使用它来显示表格和分层数据。Tkinter 中,没有专门的表格部件,Treeview 可以很好地显示表格数据,支持多列显示。
要创建 Treeview 树视图小部件,可以使用以下构造函数:
tree = ttk.Treeview(master, **options)
Treeview 显示表格数据自定义列,列宽,对齐方式
tree.column('name', anchor=tk.CENTER, width=200)
设置列标题
tree.heading('name', text='姓名')
import tkinter as tkfrom tkinter import ttkroot = tk.Tk()root.geometry('600x400+200+200')root.title('Treeview 树视图演示')columns = ('name', 'gender', 'email') # 元组,用于创建列# 创建树视图,指定列,显示元素,行数tree = ttk.Treeview(root, columns=columns, show='headings', height=18)tree.column('name', anchor=tk.CENTER, width=200)tree.column('gender', anchor=tk.CENTER, width=120)tree.column('email', anchor=tk.CENTER, width=260)# 设置列标题tree.heading('name', text='姓名')tree.heading('gender', text='性别')tree.heading('email', text='电子邮箱')# 数据表插入数据for n in range(1, 100): tree.insert('', tk.END, values=(f'name {n}', f'female/male', f'email{n}@example.com'))tree.grid(row=0, column=0, sticky='nsew', pady=5)# 数据表加滚动条scrollbar = ttk.Scrollbar(root, orient=tk.VERTICAL, command=tree.yview)tree.configure(yscroll=scrollbar.set)scrollbar.grid(row=0, column=1, sticky='ns')root.mainloop()
访问选择的数据:
for selected_item in tree.selection()
绑定项目选择事件:
tree.bind('<<TreeviewSelect>>', item_selected)
import tkinter as tkfrom tkinter import ttkfrom tkinter.messagebox import showinforoot = tk.Tk()root.geometry('600x400+200+200')root.title('Treeview 树视图演示')columns = ('name', 'gender', 'email') # 元组,用于数据表列标# 创建树视图,指定列标,显示元素,行数tree = ttk.Treeview(root, columns=columns, show='headings', height=18)# 设置列宽,对齐方式tree.column('name', anchor=tk.CENTER, width=160)tree.column('gender', anchor=tk.CENTER, width=120)tree.column('email', anchor=tk.CENTER, width=300)# 设置列标显示的文字tree.heading('name', text='姓名')tree.heading('gender', text='性别')tree.heading('email', text='邮箱')# 数据表插入数据for n in range(1, 100): tree.insert('', tk.END, values=(f'name {n}', f'female/male', f'email{n}@example.com'))tree.grid(row=0, column=0, sticky='nsew', pady=5, rowspan=5)# 数据表加滚动条scrollbar = ttk.Scrollbar(root, orient=tk.VERTICAL, command=tree.yview)tree.configure(yscroll=scrollbar.set)scrollbar.grid(row=0, column=1, sticky='ns', rowspan=5)def item_selected(event): for selected_item in tree.selection(): item = tree.item(selected_item) record = item['values'] showinfo(title='你选择了', message=','.join(record))tree.bind('<<TreeviewSelect>>', item_selected)root.mainloop()
在数据表开头添加数据:
tree.insert('', 0, values=contact)
在数据表末尾添加数据:
tree.insert('', tk.END, values=contact)
访问选择的数据:
for selected_item in tree.selection()
删除数据:
tree.delete(selected_item)
import tkinter as tkfrom tkinter import ttkroot = tk.Tk()root.geometry('600x400+200+200')root.title('Treeview 树视图演示')name = tk.StringVar()gender = tk.StringVar()email = tk.StringVar()def add(): tree.insert('', 0, values=(f'{name.get()}', f'{gender.get()}', f'{email.get()}'))def delete(): for selected_item in tree.selection(): tree.delete(selected_item)columns = ('name', 'gender', 'email') # 元组,用于数据表列标# 创建树视图,指定列标,显示元素,行数tree = ttk.Treeview(root, columns=columns, show='headings', height=18)# 设置列宽,对齐方式tree.column('name', anchor=tk.CENTER, width=120)tree.column('gender', anchor=tk.CENTER, width=120)tree.column('email', anchor=tk.CENTER, width=160)# 设置列标显示的文字tree.heading('name', text='姓名')tree.heading('gender', text='性别')tree.heading('email', text='邮箱')# 数据表插入数据for n in range(1, 100): tree.insert('', tk.END, values=(f'name {n}', f'female/male', f'email{n}@example.com'))tree.grid(row=0, column=0, sticky='nsew', pady=5, rowspan=5)# 数据表加滚动条scrollbar = ttk.Scrollbar(root, orient=tk.VERTICAL, command=tree.yview)tree.configure(yscroll=scrollbar.set)scrollbar.grid(row=0, column=1, sticky='ns', rowspan=5)name_label = tk.Label(root, text="姓名")name_label.grid(row=0, column=2)name_entry = tk.Entry(root, width=15, textvariable=name)name_entry.grid(row=0, column=3)gender_label = tk.Label(root, text="性别")gender_label.grid(row=1, column=2)gender_entry = tk.Entry(root, width=15, textvariable=gender)gender_entry.grid(row=1, column=3)email_label = tk.Label(root, text="邮箱")email_label.grid(row=2, column=2)email_entry = tk.Entry(root, width=15, textvariable=email)email_entry.grid(row=2, column=3)button1 = tk.Button(root, text="添加", command=add, width=10)button1.grid(row=3, column=3)button2 = tk.Button(root, text="删除", command=delete, width=10)button2.grid(row=4, column=3)root.mainloop()
添加项目
tree.insert('', tk.END, text='山东省', iid=0, open=False)
利用 iid ,将项目移动到某个项目作为子项目
tree.move(5, 0, 1)
将 iid 为 5 的项目移到 iid 为 0 的项目中,作为子项目,排在第二位。
import tkinter as tkfrom tkinter import ttkroot = tk.Tk()root.geometry('600x400+200+200')root.title('Treeview 树视图演示')root.rowconfigure(0, weight=1)root.columnconfigure(0, weight=1)tree = ttk.Treeview(root)tree.heading('#0', text='行政区划', anchor=tk.W)tree.insert('', tk.END, text='山东省', iid=0, open=False)tree.insert('', tk.END, text='江苏省', iid=1, open=False)tree.insert('', tk.END, text='吉林省', iid=2, open=False)tree.insert('', tk.END, text='北京市', iid=3, open=False)tree.insert('', tk.END, text='上海市', iid=4, open=False)tree.insert('', tk.END, text='济南', iid=5, open=False)tree.insert('', tk.END, text='青岛', iid=6, open=False)tree.insert('', tk.END, text='淄博', iid=7, open=False)tree.move(5, 0, 0)tree.move(6, 0, 1)tree.move(7, 0, 2)tree.insert('', tk.END, text='长春', iid=8, open=False)tree.insert('', tk.END, text='吉林', iid=9, open=False)tree.move(8, 2, 0)tree.move(9, 2, 1)tree.grid(row=0, column=0, sticky=tk.NSEW)root.mainloop()
