mirror of
https://github.com/python/cpython.git
synced 2025-10-03 05:35:59 +00:00
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:
parent
427232f9d2
commit
21a56a4bce
2 changed files with 37 additions and 27 deletions
|
@ -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
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Avoid uncaught exceptions in ``AutoCompleteWindow.winconfig_event()``.
|
Loading…
Add table
Add a link
Reference in a new issue