summaryrefslogtreecommitdiffstats
path: root/Demo/tkinter/ttk/dirbrowser.py
diff options
context:
space:
mode:
Diffstat (limited to 'Demo/tkinter/ttk/dirbrowser.py')
-rw-r--r--Demo/tkinter/ttk/dirbrowser.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/Demo/tkinter/ttk/dirbrowser.py b/Demo/tkinter/ttk/dirbrowser.py
new file mode 100644
index 0000000..bacddb5
--- /dev/null
+++ b/Demo/tkinter/ttk/dirbrowser.py
@@ -0,0 +1,93 @@
+"""A directory browser using Ttk Treeview.
+
+Based on the demo found in Tk 8.5 library/demos/browse
+"""
+import os
+import glob
+import tkinter
+from tkinter import ttk
+
+def populate_tree(tree, node):
+ if tree.set(node, "type") != 'directory':
+ return
+
+ path = tree.set(node, "fullpath")
+ tree.delete(*tree.get_children(node))
+
+ parent = tree.parent(node)
+ special_dirs = [] if parent else glob.glob('.') + glob.glob('..')
+
+ for p in special_dirs + os.listdir(path):
+ ptype = None
+ p = os.path.join(path, p).replace('\\', '/')
+ if os.path.isdir(p): ptype = "directory"
+ elif os.path.isfile(p): ptype = "file"
+
+ fname = os.path.split(p)[1]
+ id = tree.insert(node, "end", text=fname, values=[p, ptype])
+
+ if ptype == 'directory':
+ if fname not in ('.', '..'):
+ tree.insert(id, 0, text="dummy")
+ tree.item(id, text=fname)
+ elif ptype == 'file':
+ size = os.stat(p).st_size
+ tree.set(id, "size", "%d bytes" % size)
+
+
+def populate_roots(tree):
+ dir = os.path.abspath('.').replace('\\', '/')
+ node = tree.insert('', 'end', text=dir, values=[dir, "directory"])
+ populate_tree(tree, node)
+
+def update_tree(event):
+ tree = event.widget
+ populate_tree(tree, tree.focus())
+
+def change_dir(event):
+ tree = event.widget
+ node = tree.focus()
+ if tree.parent(node):
+ path = os.path.abspath(tree.set(node, "fullpath"))
+ if os.path.isdir(path):
+ os.chdir(path)
+ tree.delete(tree.get_children(''))
+ populate_roots(tree)
+
+def autoscroll(sbar, first, last):
+ """Hide and show scrollbar as needed."""
+ first, last = float(first), float(last)
+ if first <= 0 and last >= 1:
+ sbar.grid_remove()
+ else:
+ sbar.grid()
+ sbar.set(first, last)
+
+root = tkinter.Tk()
+
+vsb = ttk.Scrollbar(orient="vertical")
+hsb = ttk.Scrollbar(orient="horizontal")
+
+tree = ttk.Treeview(columns=("fullpath", "type", "size"),
+ displaycolumns="size", yscrollcommand=lambda f, l: autoscroll(vsb, f, l),
+ xscrollcommand=lambda f, l:autoscroll(hsb, f, l))
+
+vsb['command'] = tree.yview
+hsb['command'] = tree.xview
+
+tree.heading("#0", text="Directory Structure", anchor='w')
+tree.heading("size", text="File Size", anchor='w')
+tree.column("size", stretch=0, width=100)
+
+populate_roots(tree)
+tree.bind('<<TreeviewOpen>>', update_tree)
+tree.bind('<Double-Button-1>', change_dir)
+
+# Arrange the tree and its scrollbars in the toplevel
+tree.grid(column=0, row=0, sticky='nswe')
+vsb.grid(column=1, row=0, sticky='ns')
+hsb.grid(column=0, row=1, sticky='ew')
+root.grid_columnconfigure(0, weight=1)
+root.grid_rowconfigure(0, weight=1)
+
+root.mainloop()