]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-41611: IDLE: Catch TclError exceptions in AutoCompleteWindow.winconfig_event...
authorTal Einat <532281+taleinat@users.noreply.github.com>
Fri, 28 May 2021 06:07:21 +0000 (09:07 +0300)
committerGitHub <noreply@github.com>
Fri, 28 May 2021 06:07:21 +0000 (09:07 +0300)
Since the <Configure> event may occur after the
completion window is gone, catch potential
TclError exceptions when accessing acw.

Lib/idlelib/autocomplete_w.py
Misc/NEWS.d/next/IDLE/2021-05-27-18-22-46.bpo-41611.jOKpfc.rst [new file with mode: 0644]

index 4676822a6970341cc4e400a78a7d4c564fd25b62..2e3f9c14a1981419190165f8e952bb38e2801e17 100644 (file)
@@ -242,37 +242,46 @@ class AutoCompleteWindow:
         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 (file)
index 0000000..a80c9f7
--- /dev/null
@@ -0,0 +1 @@
+Avoid uncaught exceptions in ``AutoCompleteWindow.winconfig_event()``.