Bug reported by Jim Robinson:

An attempt to execute grid_slaves with arguments (0,0) results in
*all* of the slaves being returned, not just the slave associated with
row 0, column 0.  This is because the test for arguments in the method
does not test to see if row (and column) does not equal None, but
rather just whether is evaluates to non-false.  A value of 0 fails
this test.
diff --git a/Lib/lib-tk/Tkinter.py b/Lib/lib-tk/Tkinter.py
index 3e98cd6..e50a412 100644
--- a/Lib/lib-tk/Tkinter.py
+++ b/Lib/lib-tk/Tkinter.py
@@ -714,9 +714,9 @@
 	size = grid_size
 	def grid_slaves(self, row=None, column=None):
 		args = ()
-		if row:
+		if row is not None:
 			args = args + ('-row', row)
-		if column:
+		if column is not None:
 			args = args + ('-column', column)
 		return map(self._nametowidget,
 			   self.tk.splitlist(self.tk.call(
@@ -1156,6 +1156,7 @@
 		return '@' + `x` + ',' + `y`
 
 class Canvas(Widget):
+	_tagcommands = None
 	def __init__(self, master=None, cnf={}, **kw):
 		Widget.__init__(self, master, 'canvas', cnf, kw)
 	def addtag(self, *args):
@@ -1182,8 +1183,16 @@
 		if funcid:
 			self.deletecommand(funcid)
 	def tag_bind(self, tagOrId, sequence=None, func=None, add=None):
-		return self._bind((self._w, 'bind', tagOrId),
-				  sequence, func, add)
+		res = self._bind((self._w, 'bind', tagOrId),
+				 sequence, func, add)
+		if sequence and func and res:
+			# remember the funcid for later
+			if self._tagcommands is None:
+				self._tagcommands = {}
+			list = self._tagcommands.get(tagOrId) or []
+			self._tagcommands[tagOrId] = list
+			list.append(res)
+		return res
 	def canvasx(self, screenx, gridspacing=None):
 		return getdouble(self.tk.call(
 			self._w, 'canvasx', screenx, gridspacing))
@@ -1227,7 +1236,16 @@
 	def dchars(self, *args):
 		self.tk.call((self._w, 'dchars') + args)
 	def delete(self, *args):
+		self._delete_bindings(args)
 		self.tk.call((self._w, 'delete') + args)
+	def _delete_bindings(self, args):
+		for tag in args:
+			for a in self.tag_bind(tag):
+				b = self.tag_bind(tag, a)
+				c = _string.split(b, '[')[1]
+				d = _string.split(c)[0]
+				print "deletecommand(%s)" % `d`
+				self.deletecommand(d)
 	def dtag(self, *args):
 		self.tk.call((self._w, 'dtag') + args)
 	def find(self, *args):