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

taleinat webhook-mailer at python.org
Fri May 28 02:39:45 EDT 2021


https://github.com/python/cpython/commit/448abe8d8bcfdf50a5ecae1196199da46bdfed04
commit: 448abe8d8bcfdf50a5ecae1196199da46bdfed04
branch: 3.10
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: taleinat <532281+taleinat at users.noreply.github.com>
date: 2021-05-28T09:39:36+03:00
summary:

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 4e2e5c1c4f792b4011e4c78d011baea2aee39f1b)

files:
A Misc/NEWS.d/next/IDLE/2021-05-27-18-22-46.bpo-41611.jOKpfc.rst
M Lib/idlelib/autocomplete_w.py

diff --git a/Lib/idlelib/autocomplete_w.py b/Lib/idlelib/autocomplete_w.py
index 4676822a69703..2e3f9c14a1981 100644
--- a/Lib/idlelib/autocomplete_w.py
+++ b/Lib/idlelib/autocomplete_w.py
@@ -242,37 +242,46 @@ def winconfig_event(self, event):
         self.is_configuring = True
         if not self.is_active():
             return
-        # Position the completion list window
-        text = self.widget
-        text.see(self.startindex)
-        x, y, cx, cy = text.bbox(self.startindex)
-        acw = self.autocompletewindow
-        if platform.system().startswith('Windows'):
-            # On Windows an update() call is needed for the completion list
-            # window to be created, so that we can fetch its width and
-            # height. However, this is not needed on other platforms (tested
-            # on Ubuntu and macOS) but at one point began causing freezes on
-            # macOS.  See issues 37849 and 41611.
-            acw.update()
-        acw_width, acw_height = acw.winfo_width(), acw.winfo_height()
-        text_width, text_height = text.winfo_width(), text.winfo_height()
-        new_x = text.winfo_rootx() + min(x, max(0, text_width - acw_width))
-        new_y = text.winfo_rooty() + y
-        if (text_height - (y + cy) >= acw_height # enough height below
-            or y < acw_height): # not enough height above
-            # place acw below current line
-            new_y += cy
-        else:
-            # place acw above current line
-            new_y -= acw_height
-        acw.wm_geometry("+%d+%d" % (new_x, new_y))
-        acw.update_idletasks()
+
+        # 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
+            text = self.widget
+            text.see(self.startindex)
+            x, y, cx, cy = text.bbox(self.startindex)
+            acw = self.autocompletewindow
+            if platform.system().startswith('Windows'):
+                # On Windows an update() call is needed for the completion
+                # list window to be created, so that we can fetch its width
+                # and height.  However, this is not needed on other platforms
+                # (tested on Ubuntu and macOS) but at one point began
+                # causing freezes on macOS.  See issues 37849 and 41611.
+                acw.update()
+            acw_width, acw_height = acw.winfo_width(), acw.winfo_height()
+            text_width, text_height = text.winfo_width(), text.winfo_height()
+            new_x = text.winfo_rootx() + min(x, max(0, text_width - acw_width))
+            new_y = text.winfo_rooty() + y
+            if (text_height - (y + cy) >= acw_height # enough height below
+                or y < acw_height): # not enough height above
+                # place acw below current line
+                new_y += cy
+            else:
+                # place acw above current line
+                new_y -= acw_height
+            acw.wm_geometry("+%d+%d" % (new_x, new_y))
+            acw.update_idletasks()
+        except TclError:
+            pass
 
         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,
             # otherwise mouse button double click will not be able to used.
-            acw.unbind(WINCONFIG_SEQUENCE, self.winconfigid)
+            try:
+                acw.unbind(WINCONFIG_SEQUENCE, self.winconfigid)
+            except TclError:
+                pass
             self.winconfigid = None
 
         self.is_configuring = False
diff --git a/Misc/NEWS.d/next/IDLE/2021-05-27-18-22-46.bpo-41611.jOKpfc.rst b/Misc/NEWS.d/next/IDLE/2021-05-27-18-22-46.bpo-41611.jOKpfc.rst
new file mode 100644
index 0000000000000..a80c9f7c5a73b
--- /dev/null
+++ b/Misc/NEWS.d/next/IDLE/2021-05-27-18-22-46.bpo-41611.jOKpfc.rst
@@ -0,0 +1 @@
+Avoid uncaught exceptions in ``AutoCompleteWindow.winconfig_event()``.



More information about the Python-checkins mailing list