KevinWalzer: PyLocateTile is a simple GUI wrapper for the Unix "locate" command. I wrote it to illustrate how TileWrapper and TableListTileWrapper can be used in a Tkinter application. To use this, you need TileWrapper and TableListTileWrapper installed. You also must have Tile and TableList installed with Tcl/Tk.

###pylocate-tile.py: copyright 2006 by Kevin Walzer, kw@codebykevin.com. 
###My code is freely reusable under MIT license. 
###Images are from Nuvola icon set by David Vignoni, licensed under LGPL.

"""
The purpose of this application is to illustrate how to integrate some recent advances in 
Tk development into a Tkinter application. My focus here is the Tablelist widget, developed 
by Csaba Nemethi and initially wrapped for Tkinter by Martin Franklin, with additional 
modifications by Kevin Walzer; and , in the pylocate-tile version, the Tile widget set, 
developed by Joe English and others, initially wrapped for Tkinter by Martin Franklin, 
and additionally modified by Kevin Walzer.

To run pylocate or pylocate-tile, you will need TableList.py and/or Tile.py and Tablelist_Tile.py 
installed in your Python site-packages directory; and Tablelist and/or Tile themselves 
will have to be installed somewhere on your Tcl/Tk auto_path. Tablelist is a pure-Tcl package, while 
Tile is a binary extension that must be built from source. Both can be found for numerous platforms 
in the ActiveTcl distribution.

Additionally, because pylocate wraps the Unix "locate" command-line program with a GUI,
you will need to have locate installed on your system. This program is a standard part of most 
Linux and Unix systems, including Mac OS X, and Windows ports are also available for 
separate download on the Internet. 

This application is coded without classes. Coming from a Tcl background, I am more comfortable
with a procedural approach, and some of the way this application is structured 
(using global variables extensively) may not be totally "Pythonic." Still, the example 
should serve well enough for most purposes. --Kevin Walzer, 2006
"""

import Tkinter
from tkMessageBox import *
import Tile
import os
import sys
from TableList_Tile import *



searchterm = ""
table = ""
root = ""
log = ""
textimage = ""

def pylocate():

    """
    The pylocate function takes a search term and passes that term on to the standard
    Unix "locate" command via an os.popen call.The system call returns a list of files that 
    match the search term, as defined in the "locate" database. Finally, the pylocate parses the 
    list into a tuple of file name and file directories, and displays each line in the Tablelist widget, 
    while configuring each line of the widget with an icon representing a file.
    """

    global searchterm
    global root
    global log
    global textimage

    textimage = PhotoImage(data="""
    R0lGODlhEAAQANUAAAAAAODg4MjIyIiIiODg6OjQ+NjY4ODo6ODQ8OjY8OjQ8ODQ6ODY6NDI4Njg
    6BgYGNDQ0NDQyMDAwNjQ6Njg4NjQ0NDY4BAQEKioqCAgIHh4eKigoLCoqJiYmAgICLCwsLi4uNjY
    6NDQ2NjY2Ojo8ODo8Ojw8ODg8Ojo6PDw+PDw8Pj4+Pjw+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAC0AIf/8SUNDUkdCRzEwMTIA
    AALMYXBwbAIAAABtbnRyUkdCIFhZWiAH1gALABQAAAAAAABhY3NwQVBQTAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAxyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0
    AAABUAAAABRjaGFkAAABZAAAACxyVFJDAAABkAAAAA5nVFJDAAABoAAAAA5iVFJDAAABsAAAAA52
    Y2d0AAABwAAAADBu/2RpbgAAAfAAAAA4ZGVzYwAAAigAAAB0Y3BydAAAApwAAAAtWFlaIAAAAAAA
    AHRLAAA+HQAAA8xYWVogAAAAAAAAWnMAAKymAAAXJlhZWiAAAAAAAAAoGAAAFVcAALgzWFlaIAAA
    AAAAAPNRAAEAAAABFsxzZjMyAAAAAAABDEIAAAXe///zJgAAB5MAAP2Q///7ov///aMAAAPcAADA
    bmN1cnYAAAAAAAAAAQI5AABjdXJ2AAAAAAAAAAECOQAAY3VydgAAAAAAAAABAjkAAHZjZ3QAAAAA
    AAAAAQABAAAAAAAAAAEAAAABAAAAAAAAAAEAAAABAAAAAAAAAAEAANxuZGluAAAAAAAAADAAAKFI
    AABXCgAAS4UAAJrhAAAnrgAAE7YAAFANAABUOQACOOQAAjjkAAI45GRlc2MAAAAAAAAAGkNhbGli
    cmF0ZWQgUkdCIENvbG9yc3BhY2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmln
    aHQgQXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAACwAAAAAEAAQAAAGmUCNZEgsDgWDFmjF
    Yq2e0Cjk8VkVFKRS6XQiEBwhVYS6SiRMpDQJdfCmBGQzOuv1OlTwKgKRLdW/YXAcZQpzKH8UeA8Y
    KwsLJH9fBgYkEouNC211Dg6TlZcTmZuTnpaMExOaBBSkBiimK6iaAaykrw8bKw0NBK0GFiIiByCX
    DAxpqpIqlhoBI8/QFRDTEAEdHi0Z2tvc2xctQQA7
    """)
    
    localvar=searchterm.get()

    print localvar

    if localvar == "":
        showerror("Error", "Please enter a search term")

    log.delete("0", "end")
       

    file = os.popen("locate %s" % localvar, "r")
 

    for item in file: ##parse list
        filename = os.path.basename(item) ###get filename
        finalfile = filename.strip("\n") ###strip newline from filename
        dirname = os.path.dirname(item) ###get directory name
        filelist = (finalfile, dirname) ###merge into tuple
        log.insert("end", filelist) ###dump into tablelist widget
        log.cellconfigure("end,0", image=textimage) #add file graphic to each line

    file.close()

def drawGUI():

    """
    The drawGUI function lays out the basic graphical interface for PyLocate. 
    In the pylocate-tile version, it makes extensive use of the Tile widget set. 
    In the pylocate version, standard Tk widgets are used.

    The function makes some accommodations to platform-specific conventions 
    on Mac OS X on menu items (the Apple application menu) and scrollbars 
    (Tile scrollbars do not work correctly on OS X) via the "tk windowingsystem" call. 
    These are to work around bugs in the Tile set and/or Mac-specific peculiarities 
    that are not found on Windows or X11 systems.

    """

    global searchterm
    global root
    global log
    global textimage
                          
    root = Tk()
    root.title("PyLocate")

    root.tk.call("package", "require", "tile") ###tile stuff won't work without this call
    
    searchterm = StringVar()
    mb=Menu(root)
    root.configure(menu=mb)

    if root.tk.call("tk", "windowingsystem") == "aqua":   ###add apple menu, "About" item
        applemenu=Menu(mb, name="apple")
        mb.add_cascade(label="PyLocate", menu=applemenu)
        applemenu.add_command(label="About PyLocate", command=aboutprog)

    locatemenu=Menu(mb)
    mb.add_cascade(label="Locate", menu=locatemenu)
    locatemenu.add_command(label="Locate Search Term", command=pylocate)
    if not root.tk.call("tk", "windowingsystem") == "aqua": ##quit menu
        locatemenu.add_command(label="Exit", command=root.quit)



    helpmenu = Menu(mb, name="help")
    mb.add_cascade(label="Help", menu=helpmenu)
    helpmenu.add_command(label="PyLocate Help", command=runhelp)
    if not root.tk.call("tk", "windowingsystem") == "aqua":  ###about menu goes in "help menu" on non-Mac platforms
        helpmenu.add_command(label="About", command=aboutprog)

  
    mainframe = Tile.Frame(root)
    mainframe.pack(side=TOP, fill=BOTH, expand=YES)

    topframe=Tile.Frame(mainframe)
    topframe.pack(side=TOP, fill=BOTH, expand=NO)

    bottomlabel=Tile.Label(mainframe, text="", width = 80)
    bottomlabel.pack(side=BOTTOM, fill=BOTH, expand=NO)

    bottomframe=Tile.Frame(mainframe)
    bottomframe.pack(side=BOTTOM, fill=BOTH, expand=YES)


    searchglass= PhotoImage(data="""
    R0lGODlhFgAWAOYAAAAAAAgAAMjY6HiQuMjg+LjY+Ljg+LDY+JA4GPjgUKioqNDo+MDg+MDY+PjY
    UMjY8PjgWNjg4GBYWJDI+PiQEKDQ+MDIyLC4wICo4Mjo+LCwuKiw2Iig2CgoKMgoIHh4eJCQkHiY
    0HCY0PjoeJjI+JiwwJiosJCYsLBAEJCw8JCg2IiIiBgYGHBwcGBgYIjA+EBAQKB4eMhYQICAgHiA
    iIiIkICAeIiAeIiIgDg4OGhoYFhQUGhoaKg4GPioMOjQcNhIAPiQGFgQCHiAkJiQkJiYkPjQOJiY
    mKCQkKjQ+MjQ2MDAwLi4wBAQEDAwMDAoKFBQUFhYWHAQALDAwJjQ+Ji48KCosIiYyJC4+LAwALDQ
    8LDI+MjQ6KjY+LDQ+IiYoMDI4NBIAPjIOOBIAPiYGJiYoBgQEGgYCNDg+Jg4GKDA2HiIkNjo+Njw
    +ODw+JjA8KDA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
    BAEAAHEAIf/8SUNDUkdCRzEwMTIAAALMYXBwbAIAAABtbnRyUkdCIFhZWiAH1gALABIAAAAAAABh
    Y3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxyWFlaAAABFAAAABRnWFlaAAAB
    KAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRjaGFkAAABZAAAACxyVFJDAAABkAAAAA5nVFJD
    AAABoAAAAA5iVFJDAAABsAAAAA52Y2d0AAABwAAAADBu/2RpbgAAAfAAAAA4ZGVzYwAAAigAAAB0
    Y3BydAAAApwAAAAtWFlaIAAAAAAAAHRLAAA+HQAAA8xYWVogAAAAAAAAWnMAAKymAAAXJlhZWiAA
    AAAAAAAoGAAAFVcAALgzWFlaIAAAAAAAAPNRAAEAAAABFsxzZjMyAAAAAAABDEIAAAXe///zJgAA
    B5MAAP2Q///7ov///aMAAAPcAADAbmN1cnYAAAAAAAAAAQI5AABjdXJ2AAAAAAAAAAECOQAAY3Vy
    dgAAAAAAAAABAjkAAHZjZ3QAAAAAAAAAAQABAAAAAAAAAAEAAAABAAAAAAAAAAEAAAABAAAAAAAA
    AAEAANxuZGluAAAAAAAAADAAAKFIAABXCgAAS4UAAJrhAAAnrgAAE7YAAFANAABUOQACOOQAAjjk
    AAI45GRlc2MAAAAAAAAAGkNhbGlicmF0ZWQgUkdCIENvbG9yc3BhY2UAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAACwA
    AAAAFgAWAAAH8IBxgoOEhYaHN0VHOBKHjjZMGyocVycrHY6ERGApW2hsDVUhZU6ZcR9cWAwLrBkZ
    SSIrTZlLcEkFBQwMBQcHEwM7ji1cLxVJvQddSSRUGB+OIA0TJCQV1tQTFW9DZodFDUkV1ONUt15r
    LIc4Dwa8ykldBwYZWjSzhjpKDBm6/QQZbdTwyKSAAKsFGQ6yyfAlRyYXFgi0YUORjZs2JWYEMNWC
    iYAFbS4KMLHCQgwPplyA0DDlgpUaUZ4giTAChak4OaDsgDFIxg8jCXrcPDSGghgIaYYaAmI0AQKl
    hYAEEePgDFRCYcj4EHKVUBYpXR0FAgA7
    """)

    exitbutton = PhotoImage(data="""
    R0lGODlhFgAWAOYAAAAAAJAAAHAICJBAQJAICHggINjAwJAgIHgQEKgwMKA4OLA4OLg4OMg4OMhA
    OMigoOBQOOjo4NC4uNhYSODg4OBgWNhoWODQ0PhwWPhwYODIyMgAAMhIQJgICMgwKMA4ONigoOhQ
    OPjo6Ni4uPDg2PBYOPjQyODI0HgICHAQEMiwsPDw8PDw6PDo6PDY2NioqOjY2OjQ0KAICIhISNCg
    oNhQSKgQENiwsKgQGNgQANCwuOC4uMhISOC4wOi4sOi4uMAAAKgAAKAAAKhAQIAQELAoKJg4OMgY
    AKAQEMg4MMggEMAIALgAALAIAPjw8Ojg4OjI0PD4+JgYGLg4MLgQANAIAOBQQMgQAPhAGOAQAIAY
    GMAQAOAgAOgYANAQAPAQAPjw6KBISIgYGOgoAOCoqJgAAOCosPDg4PAwAOjo6JgQENggAPj48PDg
    6MgIANAYAPj4+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
    BAEAAHEAIf/8SUNDUkdCRzEwMTIAAALMYXBwbAIAAABtbnRyUkdCIFhZWiAH1gALABIAAAAAAABh
    Y3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxyWFlaAAABFAAAABRnWFlaAAAB
    KAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRjaGFkAAABZAAAACxyVFJDAAABkAAAAA5nVFJD
    AAABoAAAAA5iVFJDAAABsAAAAA52Y2d0AAABwAAAADBu/2RpbgAAAfAAAAA4ZGVzYwAAAigAAAB0
    Y3BydAAAApwAAAAtWFlaIAAAAAAAAHRLAAA+HQAAA8xYWVogAAAAAAAAWnMAAKymAAAXJlhZWiAA
    AAAAAAAoGAAAFVcAALgzWFlaIAAAAAAAAPNRAAEAAAABFsxzZjMyAAAAAAABDEIAAAXe///zJgAA
    B5MAAP2Q///7ov///aMAAAPcAADAbmN1cnYAAAAAAAAAAQI5AABjdXJ2AAAAAAAAAAECOQAAY3Vy
    dgAAAAAAAAABAjkAAHZjZ3QAAAAAAAAAAQABAAAAAAAAAAEAAAABAAAAAAAAAAEAAAABAAAAAAAA
    AAEAANxuZGluAAAAAAAAADAAAKFIAABXCgAAS4UAAJrhAAAnrgAAE7YAAFANAABUOQACOOQAAjjk
    AAI45GRlc2MAAAAAAAAAGkNhbGlicmF0ZWQgUkdCIENvbG9yc3BhY2UAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAACwA
    AAAAFgAWAAAH/4BxgoOEhYaHiImENgwyhgEJUolFUHBkSIQENHAwCodFbSYZYD0dggQvcBU+K0aF
    ODEmWF8lYDsEAS9sExtKPzAHhAxwGF9oXSFONyBwNW5HQBxwYYQyZiIlXWNZEE5wE89LHi4jRIUy
    PU4hWVw5VhNVR+JnJ1qHajtOEDlrXl7yHs5osIeoww0wVry8ObKlwRkD5hLlcjLhyhF5DlpIQJEI
    1bdwS7Yw+aARwSGPzuQlccCESpApaQwIKKSJYjgPT1h8CNJEyIInKlIQSgDHwgaAD3W0mCIkSJkh
    UQYQkgLjhxIgHkhoIIJCQoQFZTo8oFCgkIIVPni4uEAQhYEnQyEeRJlxyAgMOCMICkqhIgoFuojE
    hIlISMCAsooSK14sKBAAOw==
    """)


    searchbutton=Tile.Button(topframe, image=searchglass, command=pylocate, text="Search")
    searchbutton.image=searchglass
    searchbutton.configure(style="Toolbutton", compound=TOP)
    searchbutton.pack(side=LEFT,  expand = NO)

    quitbutton= Tile.Button(topframe, image=exitbutton, command=root.quit, text="Exit")
    quitbutton.image=exitbutton
    quitbutton.configure(style="Toolbutton", compound=TOP)
    quitbutton.pack(side=LEFT, expand=NO)

   # searchterm=StringVar()

    entryterm=Tile.Entry(topframe, textvariable=searchterm)
    entryterm.pack(side=RIGHT)
    entryterm.bind("<Return>", (lambda event: pylocate()))


    entrylabel=Tile.Label(topframe, text="Search:")
    entrylabel.pack(side=RIGHT)

    if root.tk.call("tk", "windowingsystem") == "aqua": ###standard Tk scrollbars work on OS X, but Tile ones look weird
        scrollbar = Tkinter.Scrollbar(bottomframe)
    else:
        scrollbar = Tile.Scrollbar(bottomframe)  ###use Tile scrollbars on other platforms  
    scrollbar.pack(fill=Y, expand=NO, side=RIGHT)
    
    table=TableList(bottomframe,
                    background="white",
                    columns=(0, "File", 0, "Path"),
                    stretch="all",
                    )
    table.pack(fill=BOTH, expand=YES, side=LEFT)


    scrollbar.configure(command=table.yview)
    table.configure(yscrollcommand=scrollbar.set)
    log = table

    if root.tk.call("tk", "windowingsystem") == "x11":
        root.tk.call("style", "theme", "use", "clam")

def aboutprog():
    
    showinfo("About PyLocate", "PyLocate: A GUI for locate")

def runhelp():

    showinfo("PyLocate Help", "No help available at this time")

        
if __name__ == "__main__":
  drawGUI()
  mainloop()
    

Screenshot on Mac OS X (Aqua):

http://www.codebykevin.com/pylocate-tile-aqua.png

Screenshot under X11 using Tile Clam theme:

http://www.codebykevin.com/pylocate-tile-x11.png

For an example of this application with standard Tkinter widgets, see PyLocate.

tkinter: PyLocateTile (last edited 2010-07-26 11:59:13 by localhost)