bpo-41611: IDLE: Catch TclError exceptions in AutoCompleteWindow.winconfig_event() (GH-26404)

Since the <Configure> event may occur after the
completion window is gone, catch potential
TclError exceptions when accessing acw.

(cherry picked from commit 4e2e5c1c4f)
This commit is contained in:
Miss Islington (bot) 2021-05-27 23:39:59 -07:00 committed by GitHub
parent 427232f9d2
commit 21a56a4bce
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 27 deletions

View file

@ -239,17 +239,21 @@ class AutoCompleteWindow:
self.is_configuring = True self.is_configuring = True
if not self.is_active(): if not self.is_active():
return return
# Since the <Configure> event may occur after the completion window is gone,
# catch potential TclError exceptions when accessing acw. See: bpo-41611.
try:
# Position the completion list window # Position the completion list window
text = self.widget text = self.widget
text.see(self.startindex) text.see(self.startindex)
x, y, cx, cy = text.bbox(self.startindex) x, y, cx, cy = text.bbox(self.startindex)
acw = self.autocompletewindow acw = self.autocompletewindow
if platform.system().startswith('Windows'): if platform.system().startswith('Windows'):
# On Windows an update() call is needed for the completion list # On Windows an update() call is needed for the completion
# window to be created, so that we can fetch its width and # list window to be created, so that we can fetch its width
# height. However, this is not needed on other platforms (tested # and height. However, this is not needed on other platforms
# on Ubuntu and macOS) but at one point began causing freezes on # (tested on Ubuntu and macOS) but at one point began
# macOS. See issues 37849 and 41611. # causing freezes on macOS. See issues 37849 and 41611.
acw.update() acw.update()
acw_width, acw_height = acw.winfo_width(), acw.winfo_height() acw_width, acw_height = acw.winfo_width(), acw.winfo_height()
text_width, text_height = text.winfo_width(), text.winfo_height() text_width, text_height = text.winfo_width(), text.winfo_height()
@ -264,12 +268,17 @@ class AutoCompleteWindow:
new_y -= acw_height new_y -= acw_height
acw.wm_geometry("+%d+%d" % (new_x, new_y)) acw.wm_geometry("+%d+%d" % (new_x, new_y))
acw.update_idletasks() acw.update_idletasks()
except TclError:
pass
if platform.system().startswith('Windows'): if platform.system().startswith('Windows'):
# See issue 15786. When on Windows platform, Tk will misbehave # See issue 15786. When on Windows platform, Tk will misbehave
# to call winconfig_event multiple times, we need to prevent this, # to call winconfig_event multiple times, we need to prevent this,
# otherwise mouse button double click will not be able to used. # otherwise mouse button double click will not be able to used.
try:
acw.unbind(WINCONFIG_SEQUENCE, self.winconfigid) acw.unbind(WINCONFIG_SEQUENCE, self.winconfigid)
except TclError:
pass
self.winconfigid = None self.winconfigid = None
self.is_configuring = False self.is_configuring = False

View file

@ -0,0 +1 @@
Avoid uncaught exceptions in ``AutoCompleteWindow.winconfig_event()``.