directory tree.py :  » GUI » PAGE » page » examples » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » GUI » PAGE 
PAGE » page » examples » directory-tree.py
#! /usr/bin/env python
# -*- python -*-
# Time-stamp: <2009-07-29 19:24:47 rozen>


"""
This is a rework of Guilherme Polo's example to include
folder icons which open and close.  Polo's example is Based
on bitwalk's directory browser
<http://bitwalk.blogspot.com/2008/01/ttktreeview.html>..
"""

import os
import os.path

import sys

py26 = py30 = py31 = False
version = sys.hexversion
if version >= 0x020600F0 and version < 0x020700F0 :
    py26 = True
    from Tkinter import *
    import ttk
elif version >= 0x03000000 and version < 0x03010000 :
    py30 = True
    from tkinter import *
    import ttk
elif version >= 0x03010000:
    py31 = True
    from tkinter import *
    import tkinter.ttk as ttk
else:
    print ("""
    You do not have a version of python supporting ttk widgets..
    You need a version >= 2.6 to execute PAGE modules.
    """)
    sys.exit()


def vp_start_gui():
    global val, w
    root = Tk()
    root.title('Directory Tree')
    root.geometry('609x422+377+239')
    w = New_Toplevel_1(root)
    init()
    root.mainloop()


def init():
    pass


def quit():
    sys.exit()

class New_Toplevel_1:
    def __init__(self, master=None):

        # Set background of toplevel window to match current style
        style = ttk.Style()
        theme = style.theme_use()
        default = style.lookup(theme, 'background')
        master.configure(background=default)

        self.folder = PhotoImage(file='folder.gif')
        self.openfold = PhotoImage(file='openfold.gif')
        self.stop = PhotoImage(file='stop.gif')

        self.tSc38 = ScrolledTreeView (master)
        self.tSc38.place(relx=0.26,rely=0.17,relheight=0.68,relwidth=0.47)
        self.tSc38.bind('<<TreeviewSelect>>',
                        lambda e :self.update_tree(self.tSc38))
        self.tSc38.bind('<<TreeviewOpen>>',
                        lambda e :self.tree_open(self.tSc38))
        self.tSc38.bind('<<TreeviewClose>>',
                        lambda e :self.tree_close(self.tSc38))
        self.init_tree(self.tSc38)


        self.tBu40 = ttk.Button(master)
        self.tBu40.place(x=0, y=0)
        self.tBu40.configure(text="Press to quit")
        self.tBu40.configure(compound="top")
        self.tBu40.configure(image=self.stop)
        self.tBu40.configure(command=quit)

    def init_tree(self, tree):
        tree.column('#0')
        tree.heading('#0',text='File System')
        node = tree.insert('', 'end', text='/', image=self.folder,
                           values = [ '/', 'directory'])
        self.populate_tree(tree, node)

    def populate_tree(self, tree, node):
        nd = tree.item(node)
        n_type = nd['values'][1]
        if (n_type != 'directory'): return
        n_path = nd['values'][0]
        children = tree.get_children(node)
        try:
            tree.delete(children)
        except:
            pass
        flist = os.listdir(n_path)
        flist.sort()
        for f in flist:
            path = os.path.join(n_path, f)
            if (os.path.isdir(os.path.join(n_path, f))):
                id = tree.insert(node, 'end', text=f, image=self.folder,
                                 values=(path, 'directory'))
                tree.insert(id, 'end', text='dummy')
            else:
                id = tree.insert(node, 'end', text=f, values=(path,'file'))
        tree.item(node, values=(n_path,'processed'))


    def update_tree(self, tree):
        sel = tree.selection()
        self.populate_tree(tree, sel)

    def tree_open(self, tree):
        sel = tree.selection()
        tree.item(sel,image=self.openfold)

    def tree_close(self, tree):
        sel = tree.selection()
        tree.item(sel,image=self.folder)

class AutoScroll(object):
    '''Configure the scrollbars for a widget.'''

    def __init__(self, master):
        vsb = ttk.Scrollbar(master, orient='vertical', command=self.yview)
        hsb = ttk.Scrollbar(master, orient='horizontal', command=self.xview)

        self.configure(yscrollcommand=self._autoscroll(vsb),
            xscrollcommand=self._autoscroll(hsb))
        self.grid(column=0, row=0, sticky='nsew')
        vsb.grid(column=1, row=0, sticky='ns')
        hsb.grid(column=0, row=1, sticky='ew')

        master.grid_columnconfigure(0, weight=1)
        master.grid_rowconfigure(0, weight=1)

        # Copy geometry methods of master  (took from ScrolledText.py)
        methods = Pack.__dict__.keys() + Grid.__dict__.keys() \
                  + Place.__dict__.keys()

        for meth in methods:
            if meth[0] != '_' and meth not in ('config', 'configure'):
                setattr(self, meth, getattr(master, meth))

    @staticmethod
    def _autoscroll(sbar):
        '''Hide and show scrollbar as needed.'''
        def wrapped(first, last):
            first, last = float(first), float(last)

            if first <= 0 and last >= 1:
                sbar.grid_remove()
            else:
                sbar.grid()

            sbar.set(first, last)

        return wrapped

    def __str__(self):
        return str(self.master)

def _create_container(func):
    '''Creates a ttk Frame with a given master, and use this new frame to
    place the scrollbars and the widget.'''
    def wrapped(cls, master, **kw):
        container = ttk.Frame(master)
        return func(cls, container, **kw)

    return wrapped

class ScrolledTreeView(AutoScroll, ttk.Treeview):
    '''A standard ttk Treeview widget with scrollbars that will
    automatically show/hide as needed.'''
    @_create_container
    def __init__(self, master, **kw):
        ttk.Treeview.__init__(self, master, **kw)
        AutoScroll.__init__(self, master)


if __name__ == '__main__':
    vp_start_gui()



www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.