From 5ac00ac1403e4d0981c5042cc76cd09ae6de2570 Mon Sep 17 00:00:00 2001
From: Guido van Rossum <guido@python.org>
Date: Thu, 11 Dec 1997 02:03:55 +0000
Subject: Fix problem detected by Greg McFarlane -- callbacks passed to
 bind_class() and bind_all() are destroyed when the widget to which they were
 passed is destroyed.

---
 Lib/lib-tk/Tkinter.py | 26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/Lib/lib-tk/Tkinter.py b/Lib/lib-tk/Tkinter.py
index 3cd5768..e7e6bb9 100644
--- a/Lib/lib-tk/Tkinter.py
+++ b/Lib/lib-tk/Tkinter.py
@@ -121,6 +121,7 @@ def getboolean(s):
 
 # Methods defined on both toplevel and interior widgets
 class Misc:
+	# XXX font command?
 	_tclCommands = None
 	def destroy(self):
 		if self._tclCommands is not None:
@@ -131,8 +132,10 @@ class Misc:
 	def deletecommand(self, name):
 		#print '- Tkinter: deleted command', name
 		self.tk.deletecommand(name)
-		index = self._tclCommands.index(name)
-		del self._tclCommands[index]
+		try:
+			self._tclCommands.remove(name)
+		except ValueError:
+			pass
 	def tk_strictMotif(self, boolean=None):
 		return self.tk.getboolean(self.tk.call(
 			'set', 'tk_strictMotif', boolean))
@@ -435,12 +438,13 @@ class Misc:
 				self.tk.call('bindtags', self._w))
 		else:
 			self.tk.call('bindtags', self._w, tagList)
-	def _bind(self, what, sequence, func, add):
+	def _bind(self, what, sequence, func, add, needcleanup=1):
 		if func:
 			cmd = ("%sset _tkinter_break [%s %s]\n"
 			       'if {"$_tkinter_break" == "break"} break\n') \
 			       % (add and '+' or '',
-				  self._register(func, self._substitute),
+				  self._register(func, self._substitute,
+						 needcleanup),
 				  _string.join(self._subst_format))
 			apply(self.tk.call, what + (sequence, cmd))
 		elif func == '':
@@ -452,11 +456,11 @@ class Misc:
 	def unbind(self, sequence):
 		self.tk.call('bind', self._w, sequence, '')
 	def bind_all(self, sequence=None, func=None, add=None):
-		return self._bind(('bind', 'all'), sequence, func, add)
+		return self._bind(('bind', 'all'), sequence, func, add, 0)
 	def unbind_all(self, sequence):
 		self.tk.call('bind', 'all' , sequence, '')
 	def bind_class(self, className, sequence=None, func=None, add=None):
-		return self._bind(('bind', className), sequence, func, add)
+		return self._bind(('bind', className), sequence, func, add, 0)
 	def unbind_class(self, className, sequence):
 		self.tk.call('bind', className , sequence, '')
 	def mainloop(self, n=0):
@@ -506,7 +510,7 @@ class Misc:
 			w = w.children[name]
 			name = tail
 		return w
-	def _register(self, func, subst=None):
+	def _register(self, func, subst=None, needcleanup=1):
 		f = CallWrapper(func, subst, self).__call__
 		name = `id(f)`
 		try:
@@ -518,9 +522,10 @@ class Misc:
 		except AttributeError:
 			pass
 		self.tk.createcommand(name, f)
-		if self._tclCommands is None:
-			self._tclCommands = []
-		self._tclCommands.append(name)
+		if needcleanup:
+			if self._tclCommands is None:
+				self._tclCommands = []
+       			self._tclCommands.append(name)
 		#print '+ Tkinter created command', name
 		return name
 	register = _register
@@ -1737,6 +1742,7 @@ class PhotoImage(Image):
 	# XXX config
 	def __getitem__(self, key):
 		return self.tk.call(self.name, 'cget', '-' + key)
+	# XXX copy -from, -to, ...?
 	def copy(self):
 		destImage = PhotoImage()
 		self.tk.call(destImage, 'copy', self.name)
-- 
cgit v0.12

