WJG (09/Mar/06) Now that I tend to use starkits and wrap up my Tcl/Tk apps, I leave my button graphics in convenient subdirectory in the .vfs directory where all of my app. modules are located. Previously I would convert my bitmaps to ascii and include them in the module code itself. I like things neat and tidy, the fewer the better. All those fiddly little gif files -yuk! Now I can just wack em into a draw and forget them. A bit like old socks eh?
#--------------- # LoadButtons.tcl #--------------- # William J Giddings, 24/Feb/2006 #--------------- # # Batch loading of bitmaps for GUI buttons etc., # # switches: # -pattern filename of image to load, or wilcard e.g., *.gif # # returns # list of images created # # Note: # ----- # The names of the images created is the rootname of file. #--------------- set DEMO(loadbuttons) yes # For non-gif filetypes, load the Img Package package require Img #--------------- # load bitmaps from specific directory #--------------- proc LoadButtons {dir args} { # set default values set pattern *.gif set display no # set switches foreach {arg val} $args { set arg [string trimleft $arg -] set $arg $val } # create list of detected files set k [glob -nocomplain -directory $dir $pattern] foreach i $k { # create a list of image names lappend j [file root [file tail $i]] } # create images set k 0 foreach i [glob -directory $dir $pattern] { image create photo [lindex $j $k] -file $i incr k } return $j } #---------------- # the ubiquitous demo #---------------- if {$DEMO(loadbuttons)} { console show # assume pics are in a sub-directory of their own set dir [pwd]/pics set pattern *.gif puts [LoadButtons $dir -pattern $pattern -display yes] # create an display destroy .disp toplevel .disp wm title .disp "$dir/$pattern" canvas .disp.can -yscrollcommand ".disp.vscr set" scrollbar .disp.vscr -command ".disp.can yview" pack .disp.can -side left -expand yes -fill both pack .disp.vscr -side right -fill y # create graphics viewe set x 10 ; set y 0 foreach i [lsort [image names]] { label .disp.can.l$i -text $i -image $i -compound left .disp.can create window $x $y -window .disp.can.l$i -anchor nw set h [image height [.disp.can.l$i cget -image]] if {$h < 15} {set h 15} incr y [expr $h + 5] } .disp.can configure -scrollregion "0 0 50 $y" }