diff --git a/Tools/pynche/StripViewer.py b/Tools/pynche/StripViewer.py
index c927009..2b5691f 100644
--- a/Tools/pynche/StripViewer.py
+++ b/Tools/pynche/StripViewer.py
@@ -1,7 +1,9 @@
+import string
 from Tkinter import *
 import Pmw
 import ColorDB
 
+
 class LeftArrow:
     _ARROWWIDTH = 30
     _ARROWHEIGHT = 15
@@ -73,14 +75,14 @@
     _NUMCHIPS = 40
 
     def __init__(self, parent=None, **kw):
-	options = (('color', (128, 128, 128), self.__set_color),
-		   ('delegate', None, None),
-		   ('chipwidth', self._CHIPWIDTH, Pmw.INITOPT),
+	options = (('color',      (128, 128, 128),  self.__set_color),
+		   ('delegate',   None,             self.__set_delegate),
+		   ('chipwidth',  self._CHIPWIDTH,  Pmw.INITOPT),
 		   ('chipheight', self._CHIPHEIGHT, Pmw.INITOPT),
-		   ('numchips', self._NUMCHIPS, Pmw.INITOPT),
-		   ('generator', None, Pmw.INITOPT),
-		   ('axis', None, Pmw.INITOPT),
-		   ('label', '', Pmw.INITOPT),
+		   ('numchips',   self._NUMCHIPS,   Pmw.INITOPT),
+		   ('generator',  None,             Pmw.INITOPT),
+		   ('axis',       None,             Pmw.INITOPT),
+		   ('label',      '',               Pmw.INITOPT),
 		   )
 	self.defineoptions(kw, options)
 
@@ -116,12 +118,13 @@
 	x = 1
 	y = 30
 	for c in range(self.__numchips):
+	    color = 'grey'
 	    rect = self.__canvas.create_rectangle(
 		x, y, x+chipwidth, y+chipheight,
-		fill='grey', outline='grey')
+		fill=color, outline=color)
 
 	    x = x + chipwidth + 1		  # for outline
-	    chips.append(rect)
+	    chips.append(color)
 
 	# create the string tag
 	self.__label = self.__canvas.create_text(
@@ -140,24 +143,37 @@
 	self.__axis = self['axis']
 	assert self.__axis in (0, 1, 2)
 	self.initialiseoptions(StripWidget)
+	self.__delegate = self['delegate']
 
     def __set_color(self):
 	rgbtuple = self['color']
 	self.set_color(self, rgbtuple)
 
     def __arrow_x(self, chipnum):
-	coords = self.__canvas.coords(self.__chips[chipnum])
+	coords = self.__canvas.coords(chipnum+1)
 	assert coords
 	x0, y0, x1, y1 = coords
 	return (x1 + x0) / 2.0
 
     def __select_chip(self, event=None):
-	chip = self.__canvas.find_closest(event.x, event.y)
-	delegate = self['delegate']
-	if chip and delegate:
-	    color = self.__canvas.itemcget(chip, 'fill')
+	chip = self.__canvas.find_closest(event.x, event.y)[0]
+	if chip and self.__delegate:
+	    color = self.__chips[chip-1]
 	    rgbtuple = ColorDB.rrggbb_to_triplet(color)
-	    delegate.set_color(self, rgbtuple)
+	    self.__delegate.set_color(self, rgbtuple)
+
+## 	    import profile
+## 	    import pstats
+## 	    import tempfile
+## 	    statfile = tempfile.mktemp()
+## 	    p = profile.Profile()
+## 	    p.runcall(self.__delegate.set_color, self, rgbtuple)
+## 	    p.dump_stats(statfile)
+## 	    s = pstats.Stats(statfile)
+## 	    s.strip_dirs().sort_stats('time').print_stats(10)
+
+    def __set_delegate(self):
+	self.__delegate = self['delegate']
 	
 
     #
@@ -166,39 +182,53 @@
 
     def set_color(self, obj, rgbtuple):
 	red, green, blue = rgbtuple
-	if self.__generator:
-	    i = 0
-	    chip = 0
-	    for t in self.__generator(self.__numchips, rgbtuple):
-		rrggbb = ColorDB.triplet_to_rrggbb(t)
-		self.__canvas.itemconfigure(self.__chips[i],
-					    fill=rrggbb,
-					    outline=rrggbb)
-		tred, tgreen, tblue = t
-		if tred <= red and tgreen <= green and tblue <= blue:
-		    chip = i
-		i = i + 1
-	    # get the arrow's text
-	    coloraxis = rgbtuple[self.__axis]
-	    text = repr(coloraxis)
+	assert self.__generator
+	i = 1
+	chip = 0
+	chips = self.__chips = []
+	tclcmd = []
+	for t in self.__generator(self.__numchips, rgbtuple):
+	    rrggbb = ColorDB.triplet_to_rrggbb(t)
+	    chips.append(rrggbb)
+## 	    self.__canvas.itemconfigure(i,
+## 					fill=rrggbb,
+## 					outline=rrggbb)
+	    tclcmd.append(self.__canvas._w)
+	    tclcmd.append('itemconfigure')
+	    tclcmd.append(`i`)
+	    tclcmd.append('-fill')
+	    tclcmd.append(rrggbb)
+	    tclcmd.append('-outline')
+	    tclcmd.append(rrggbb)
+	    tclcmd.append('\n')
+	    tred, tgreen, tblue = t
+	    if tred <= red and tgreen <= green and tblue <= blue:
+		chip = i
+	    i = i + 1
+	# call the raw tcl script
+	script = string.join(tclcmd, ' ')
+	self.__canvas.tk.eval(script)
 
-	    # move the arrow, and set it's text
-	    if coloraxis <= 128:
-		# use the left chip
-		self.__leftarrow.set_text(text)
-		self.__leftarrow.move_to(self.__arrow_x(chip))
-		self.__rightarrow.move_to(-100)
-	    else:
-		# use the right chip
-		self.__rightarrow.set_text(text)
-		self.__rightarrow.move_to(self.__arrow_x(chip))
-		self.__leftarrow.move_to(-100)
-	    # and set the chip's outline
-	    pmwrgb = ColorDB.triplet_to_pmwrgb(rgbtuple)
-	    b = Pmw.Color.rgb2brightness(pmwrgb)
-	    if b <= 0.5:
-		outline = 'white'
-	    else:
-		outline = 'black'
-	    self.__canvas.itemconfigure(self.__chips[chip],
-					outline=outline)
+	# get the arrow's text
+	coloraxis = rgbtuple[self.__axis]
+	text = repr(coloraxis)
+
+	# move the arrow, and set it's text
+	if coloraxis <= 128:
+	    # use the left chip
+	    self.__leftarrow.set_text(text)
+	    self.__leftarrow.move_to(self.__arrow_x(chip-1))
+	    self.__rightarrow.move_to(-100)
+	else:
+	    # use the right chip
+	    self.__rightarrow.set_text(text)
+	    self.__rightarrow.move_to(self.__arrow_x(chip-1))
+	    self.__leftarrow.move_to(-100)
+	# and set the chip's outline
+	pmwrgb = ColorDB.triplet_to_pmwrgb(rgbtuple)
+	b = Pmw.Color.rgb2brightness(pmwrgb)
+	if b <= 0.5:
+	    outline = 'white'
+	else:
+	    outline = 'black'
+	self.__canvas.itemconfigure(chip, outline=outline)
