Issue #20167: Suppress 3.4 specific 'Exception ignored' messages.
Original patch by Tal Einat.
This commit is contained in:
parent
bfd68bf4ac
commit
57e4127781
|
@ -57,6 +57,13 @@ _modifier_names = dict([(name, number)
|
||||||
for number in range(len(_modifiers))
|
for number in range(len(_modifiers))
|
||||||
for name in _modifiers[number]])
|
for name in _modifiers[number]])
|
||||||
|
|
||||||
|
# In 3.4, if no shell window is ever open, the underlying Tk widget is
|
||||||
|
# destroyed before .__del__ methods here are called. The following
|
||||||
|
# is used to selectively ignore shutdown exceptions to avoid
|
||||||
|
# 'Exception ignored' messages. See http://bugs.python.org/issue20167
|
||||||
|
APPLICATION_GONE = '''\
|
||||||
|
can't invoke "bind" command: application has been destroyed'''
|
||||||
|
|
||||||
# A binder is a class which binds functions to one type of event. It has two
|
# A binder is a class which binds functions to one type of event. It has two
|
||||||
# methods: bind and unbind, which get a function and a parsed sequence, as
|
# methods: bind and unbind, which get a function and a parsed sequence, as
|
||||||
# returned by _parse_sequence(). There are two types of binders:
|
# returned by _parse_sequence(). There are two types of binders:
|
||||||
|
@ -98,7 +105,12 @@ class _SimpleBinder:
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
if self.handlerid:
|
if self.handlerid:
|
||||||
self.widget.unbind(self.widgetinst, self.sequence, self.handlerid)
|
try:
|
||||||
|
self.widget.unbind(self.widgetinst, self.sequence,
|
||||||
|
self.handlerid)
|
||||||
|
except tkinter.TclError as e:
|
||||||
|
if e.args[0] == APPLICATION_GONE:
|
||||||
|
pass
|
||||||
|
|
||||||
# An int in range(1 << len(_modifiers)) represents a combination of modifiers
|
# An int in range(1 << len(_modifiers)) represents a combination of modifiers
|
||||||
# (if the least significent bit is on, _modifiers[0] is on, and so on).
|
# (if the least significent bit is on, _modifiers[0] is on, and so on).
|
||||||
|
@ -227,7 +239,11 @@ class _ComplexBinder:
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
for seq, id in self.handlerids:
|
for seq, id in self.handlerids:
|
||||||
|
try:
|
||||||
self.widget.unbind(self.widgetinst, seq, id)
|
self.widget.unbind(self.widgetinst, seq, id)
|
||||||
|
except tkinter.TclError as e:
|
||||||
|
if e.args[0] == APPLICATION_GONE:
|
||||||
|
break
|
||||||
|
|
||||||
# define the list of event types to be handled by MultiEvent. the order is
|
# define the list of event types to be handled by MultiEvent. the order is
|
||||||
# compatible with the definition of event type constants.
|
# compatible with the definition of event type constants.
|
||||||
|
@ -390,8 +406,11 @@ def MultiCallCreator(widget):
|
||||||
func, triplets = self.__eventinfo[virtual]
|
func, triplets = self.__eventinfo[virtual]
|
||||||
if func:
|
if func:
|
||||||
for triplet in triplets:
|
for triplet in triplets:
|
||||||
|
try:
|
||||||
self.__binders[triplet[1]].unbind(triplet, func)
|
self.__binders[triplet[1]].unbind(triplet, func)
|
||||||
|
except tkinter.TclError as e:
|
||||||
|
if e.args[0] == APPLICATION_GONE:
|
||||||
|
break
|
||||||
|
|
||||||
_multicall_dict[widget] = MultiCall
|
_multicall_dict[widget] = MultiCall
|
||||||
return MultiCall
|
return MultiCall
|
||||||
|
|
Loading…
Reference in New Issue