WJG (17/03/11) I don't like bloatware. I like things simple, like me. The media players that ship with our Distros are just too complicated and well, annoying. I wanted to listen to my favourite audio tracks whilst working this morning and was so fed up of fiddling with apps that I thought: "Gnocl has built-in sound playback, let's build a custom jukebox!" So, here it is.
#---------------
# playOGG.tcl
#---------------
#!/bin/sh
#\
exec tclsh "$0" "$@"
package require Gnocl
set box [gnocl::box -orientation vertical]
set i 0
foreach track [lsort [glob *.ogg]] {
set b($i) [gnocl::button \
-icon %#Cdrom \
-text $track \
-onClicked "gnocl::sound \"$track\""]
$box add $b($i)
incr i
}
gnocl::window -child $box
gnocl::mainLoopWJG (18/03/11) The problem with little nibbles like the one above is that they make me greedy, I want more. After a little while bloating might occur! However, all that extra power comes from the Gnocl bindings to the Gtk+ libraries so even the a growing Tcl based app remains slim.
Yesterday I listened to my favourite Italian madrigals all day long and wanted a bit of a change. So, modified the code somewhat to allow directory changes and use of the gnocl::list widget rather than buttons. Much nicer. I think that I'll listen to my favourite Vivaldi guitar concertos today. Here's my screenshot:

And the script:
#---------------
# jukeBox.tcl
#---------------
#!/bin/sh
#\
exec tclsh "$0" "$@"
package require Gnocl
#---------------
# create playlist
#---------------
proc playList { dir {type ogg} } {
global lst
cd $dir
# clear the existing playlist
$lst erase 0 end
set tracks ""
catch { set tracks [glob *.ogg] }
if {$tracks == ""} {
makeUI [gnocl::fileChooserDialog \
-title "JukeBox: No tracks found. Select Collection Folder.." \
-action openFolder \
-currentFolder $dir ]
}
foreach track [lsort $tracks] {
$lst add [list [list $track]]
}
}
#---------------
# make ui
#---------------
proc makeUI {dir} {
global lst
cd $dir
set cb [gnocl::folderChooserButton \
-title "JukeBox: Select Collection Folder" \
-onFileSet {playList %f}]
set lst [gnocl::list \
-titles {"Track"} \
-types {string } \
-onSelectionChanged {
gnocl::sound [%w get %p 0 ]
}]
playList $dir
set box [gnocl::box -orientation vertical]
$box add $cb
$box add $lst -expand 1 -fill {1 1}
gnocl::window \
-title "JukeBox (1.0)" \
-child $box \
-onDelete exit
}
#---------------
# use specified directory or pick a new one
#---------------
if { $::argc > 0 } {
makeUI $::argv
} else {
# select a directory
makeUI [gnocl::fileChooserDialog \
-title "JukeBox: Select Collection Folder" \
-action openFolder \
-currentFolder $::env(HOME)/Music ]
}