diff --git a/Demo/stdwin/jukebox.py b/Demo/stdwin/jukebox.py
index 61e7560..0a74458 100755
--- a/Demo/stdwin/jukebox.py
+++ b/Demo/stdwin/jukebox.py
@@ -19,17 +19,19 @@
 #
 # Most sound file formats recognized by SOX or SFPLAY are recognized.
 # Since conversion is costly, converted files are cached in
-# /usr/tmp/@j* until the user quits.
+# /usr/tmp/@j* until the user quits or changes the sampling rate via
+# the Rate menu.
 
 import commands
 import getopt
 import os
+from stat import *
 import rand
 import stdwin
 from stdwinevents import *
-import string
 import sys
 import tempfile
+import sndhdr
 
 from WindowParent import WindowParent
 from Buttons import PushButton
@@ -96,13 +98,17 @@
 		killchild()
 
 # Entries in Rate menu:
-rates = ['default', \
+rates = ['default', '7350', \
 	'8000', '11025', '16000', '22050', '32000', '41000', '48000']
 
 def maineventloop():
 	mouse_events = WE_MOUSE_DOWN, WE_MOUSE_MOVE, WE_MOUSE_UP
 	while G.windows:
-		type, w, detail = event = stdwin.getevent()
+		try:
+			type, w, detail = event = stdwin.getevent()
+		except KeyboardInterrupt:
+			killchild()
+			continue
 		if w == G.cw.win:
 			if type == WE_CLOSE:
 				return
@@ -185,14 +191,22 @@
 	list.sort()
 	i = 0
 	while i < len(list):
-		if list[i] == '.' or list[i] == '..':
+		if list[i][0] == '.':
 			del list[i]
 		else:
 			i = i+1
 	for i in range(len(list)):
-		name = list[i]
-		if os.path.isdir(os.path.join(dirname, name)):
-			list[i] = list[i] + '/'
+		fullname = os.path.join(dirname, list[i])
+		if os.path.isdir(fullname):
+			info = '/'
+		else:
+			try:
+				size = os.stat(fullname)[ST_SIZE]
+				info = `(size + 1023)/1024` + 'k'
+			except IOError:
+				info = '???'
+			info = '(' + info + ')'
+		list[i] = list[i], info
 	width = maxwidth(list)
 	# width = width + stdwin.textwidth(' ')	# XXX X11 stdwin bug workaround
 	height = len(list) * stdwin.lineheight()
@@ -211,8 +225,8 @@
 
 def maxwidth(list):
 	width = 1
-	for name in list:
-		w = stdwin.textwidth(name)
+	for name, info in list:
+		w = stdwin.textwidth(name + '  ' + info)
 		if w > width: width = w
 	return width
 
@@ -222,8 +236,12 @@
 	d.erase((0, 0), (1000, 10000))
 	lh = d.lineheight()
 	h, v = 0, 0
-	for name in w.list:
-		d.text((h, v), name)
+	for name, info in w.list:
+		if info == '/':
+			text = name + '/'
+		else:
+			text = name + '  ' + info
+		d.text((h, v), text)
 		v = v + lh
 	showselection(w, d)
 	d.close()
@@ -257,22 +275,17 @@
 	d.close()
 	if type == WE_MOUSE_DOWN and clicks >= 2 and i >= 0:
 		setcursors('watch')
-		name = os.path.join(w.dirname, w.list[i])
-		if name[-1:] == '/':
+		name, info = w.list[i]
+		fullname = os.path.join(w.dirname, name)
+		if info == '/':
 			if clicks == 2:
-				G.windows.append(openlistwindow(name[:-1]))
+				G.windows.append(openlistwindow(fullname))
 		else:
-			playfile(name)
+			playfile(fullname)
 		setcursors('cross')
 
 def closelistwindow(w):
-	remove(G.windows, w)
-
-def remove(list, item):
-	for i in range(len(list)):
-		if list[i] == item:
-			del list[i]
-			break
+	G.windows.remove(w)
 
 def setcursors(cursor):
 	for w in G.windows:
@@ -298,7 +311,6 @@
 
 def playfile(filename):
 	killchild()
-	import sndhdr
 	tuple = sndhdr.what(filename)
 	raw = 0
 	if tuple:
@@ -338,6 +350,10 @@
 			print cmd
 			print 'Exit status', sts
 			stdwin.fleep()
+			try:
+				os.unlink(tempname)
+			except:
+				pass
 			return
 		cache[filename] = tempname
 	if raw:
@@ -352,7 +368,6 @@
 		G.cw.win.settimer(1)
 
 def sfplayraw(filename, tuple):
-	import sndhdr
 	args = ['-i']
 	type, rate, channels, frames, bits = tuple
 	if type == 'ul':
