tkinter.treeview详解
Tkinter是Python的标准GUI(图形用户界面)工具包,其中包含了许多常用的组件和控件,如按钮、标签、文本框以及树视图(treeview)。树视图是一种用来展示层次数据的控件,通常用来展示文件系统、数据表格等结构化数据。在本文中,我们将详细介绍Tkinter中的树视图组件,并且演示如何使用它创建一个简单的文件浏览器。
树视图组件的基本结构
树视图是一个可以展开和折叠的可视化控件,通过层级结构展示数据。在Tkinter中,树视图是通过ttk.Treeview
类来实现的。我们首先导入tkinter和ttk模块:
import tkinter as tk
from tkinter import ttk
然后,我们可以创建一个简单的树视图组件:
window = tk.Tk()
tree = ttk.Treeview(window)
tree.pack()
window.mainloop()
上面的代码创建了一个Tkinter窗口,并在窗口中创建了一个空的树视图。运行这段代码,你会看到一个空白的窗口,其中包含了一个空的树视图组件。
添加树视图的列
树视图通常包含多列,每一列对应于数据结构中的一个属性。我们可以通过['列名1', '列名2', ...]
的方式来指定树视图的列名。下面的代码演示了如何在树视图中添加两列:
window = tk.Tk()
tree = ttk.Treeview(window, columns=('Size', 'Type'))
tree.heading('#0', text='Name')
tree.heading('Size', text='Size')
tree.heading('Type', text='Type')
tree.pack()
window.mainloop()
运行这段代码,你会看到树视图中添加了三列,分别是”Name”、”Size”和”Type”。
添加树视图的数据
树视图的数据通常以字典或者嵌套列表的形式表示,其中每一项数据对应着树视图中的一行。我们可以通过tree.insert(parent, index, text='', values=(value1, value2, ...))
方法向树视图中添加数据。下面的代码演示了如何向树视图中添加数据:
window = tk.Tk()
tree = ttk.Treeview(window, columns=('Size', 'Type'))
tree.heading('#0', text='Name')
tree.heading('Size', text='Size')
tree.heading('Type', text='Type')
tree.pack()
# 添加数据
tree.insert('', 'end', text='Folder', values=('N/A', 'Directory'))
tree.insert('', 'end', text='File1.txt', values=('1KB', 'Text File'))
tree.insert('', 'end', text='File2.png', values=('100KB', 'Image File'))
window.mainloop()
运行这段代码,你会看到树视图中添加了三行数据,分别是一个文件夹和两个文件,每一行数据对应着树视图中的一行。
树视图的事件处理
树视图支持多种事件,如单击、双击、右击等事件。我们可以通过tree.bind('<事件>', <函数>)
的方式来绑定事件处理函数。下面的代码演示了如何在树视图中双击某一行数据时弹出对应的文件:
import os
def on_double_click(event):
item = tree.focus()
filename = tree.item(item, 'text')
if os.path.isdir(filename):
os.system('open ' + filename)
else:
os.system('open ' + filename)
window = tk.Tk()
tree = ttk.Treeview(window, columns=('Size', 'Type'))
tree.heading('#0', text='Name')
tree.heading('Size', text='Size')
tree.heading('Type', text='Type')
tree.bind('<Double-1>', on_double_click)
tree.pack()
# 添加数据
tree.insert('', 'end', text='Folder', values=('N/A', 'Directory'))
tree.insert('', 'end', text='File1.txt', values=('1KB', 'Text File'))
tree.insert('', 'end', text='File2.png', values=('100KB', 'Image File'))
window.mainloop()
运行这段代码,你会看到当双击树视图中的文件夹或文件时,系统会打开对应的文件。
实现一个简单的文件浏览器
最后,我们可以将上面的所有代码组合在一起,实现一个简单的文件浏览器。下面的完整代码演示了如何创建一个简单的文件浏览器:
import tkinter as tk
from tkinter import ttk
import os
def on_double_click(event):
item = tree.focus()
filename = tree.item(item, 'text')
if os.path.isdir(filename):
tree.delete(*tree.get_children())
for f in os.listdir(filename):
if os.path.isdir(os.path.join(filename, f)):
tree.insert('', 'end', text=f, values=('N/A', 'Directory'))
else:
tree.insert('', 'end', text=f, values=(str(os.path.getsize(os.path.join(filename, f)) + ' bytes'), 'File'))
window = tk.Tk()
window.title('File Browser')
tree = ttk.Treeview(window, columns=('Size', 'Type'))
tree.heading('#0', text='Name')
tree.heading('Size', text='Size')
tree.heading('Type', text='Type')
tree.bind('<Double-1>', on_double_click)
tree.pack()
for f in os.listdir('/'):
if os.path.isdir(os.path.join('/', f)):
tree.insert('', 'end', text=f, values=('N/A', 'Directory'))
else:
tree.insert('', 'end', text=f, values=(str(os.path.getsize(os.path.join('/', f)) + ' bytes'), 'File'))
window.mainloop()
运行这段代码,你会看到一个简单的文件浏览器窗口,其中展示了根目录下的文件和文件夹。当双击文件夹时,文件浏览器会展示文件夹中的内容,并且显示文件和文件夹的大小。