蛊毒传说
CPython的源代码中有一个示例,说明如何用目录的内容递归地填充Treeview,这基本上是它的工作方式(为了更好的可读性,我删除了事件绑定并将其包装在一个类中):import osimport tkinter as tkimport tkinter.ttk as ttkclass App(tk.Frame): def __init__(self, master, path): tk.Frame.__init__(self, master) self.tree = ttk.Treeview(self) ysb = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview) xsb = ttk.Scrollbar(self, orient='horizontal', command=self.tree.xview) self.tree.configure(yscroll=ysb.set, xscroll=xsb.set) self.tree.heading('#0', text=path, anchor='w') abspath = os.path.abspath(path) root_node = self.tree.insert('', 'end', text=abspath, open=True) self.process_directory(root_node, abspath) self.tree.grid(row=0, column=0) ysb.grid(row=0, column=1, sticky='ns') xsb.grid(row=1, column=0, sticky='ew') self.grid() def process_directory(self, parent, path): for p in os.listdir(path): abspath = os.path.join(path, p) isdir = os.path.isdir(abspath) oid = self.tree.insert(parent, 'end', text=p, open=False) if isdir: self.process_directory(oid, abspath)root = tk.Tk()path_to_my_project = # ...app = App(root, path=path_to_my_project)app.mainloop()更新:正如@ArtOfWarfare所提到的,可以使用该<<TreeviewOpen>>事件懒散地填充树。为了模拟封闭的节点,我使用了一个空的子项,该子项在打开目录时将被删除:import osimport tkinter as tkimport tkinter.ttk as ttkclass App(object): def __init__(self, master, path): self.nodes = dict() frame = tk.Frame(master) self.tree = ttk.Treeview(frame) ysb = ttk.Scrollbar(frame, orient='vertical', command=self.tree.yview) xsb = ttk.Scrollbar(frame, orient='horizontal', command=self.tree.xview) self.tree.configure(yscroll=ysb.set, xscroll=xsb.set) self.tree.heading('#0', text='Project tree', anchor='w') self.tree.grid() ysb.grid(row=0, column=1, sticky='ns') xsb.grid(row=1, column=0, sticky='ew') frame.grid() abspath = os.path.abspath(path) self.insert_node('', abspath, abspath) self.tree.bind('<<TreeviewOpen>>', self.open_node) def insert_node(self, parent, text, abspath): node = self.tree.insert(parent, 'end', text=text, open=False) if os.path.isdir(abspath): self.nodes[node] = abspath self.tree.insert(node, 'end') def open_node(self, event): node = self.tree.focus() abspath = self.nodes.pop(node, None) if abspath: self.tree.delete(self.tree.get_children(node)) for p in os.listdir(abspath): self.insert_node(node, p, os.path.join(abspath, p))if __name__ == '__main__': root = tk.Tk() app = App(root, path='.') root.mainloop()