diff options
author | Guido van Rossum <guido@python.org> | 1997-12-11 02:03:55 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1997-12-11 02:03:55 (GMT) |
commit | 5ac00ac1403e4d0981c5042cc76cd09ae6de2570 (patch) | |
tree | 5cf659430ad51ba2143afac6c401a63b9026bf1e /Lib/lib-tk | |
parent | d1f4984a9bb2e90d4fc473be1a169917277efa4d (diff) | |
download | cpython-5ac00ac1403e4d0981c5042cc76cd09ae6de2570.zip cpython-5ac00ac1403e4d0981c5042cc76cd09ae6de2570.tar.gz cpython-5ac00ac1403e4d0981c5042cc76cd09ae6de2570.tar.bz2 |
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.
Diffstat (limited to 'Lib/lib-tk')
-rw-r--r-- | Lib/lib-tk/Tkinter.py | 26 |
1 files 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) |