Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 12b1dc2

Browse files
authored
Merge pull request #25170 from meeseeksmachine/auto-backport-of-pr-25097-on-v3.7.x
2 parents 53a4b88 + 9ddd37a commit 12b1dc2

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

lib/matplotlib/backends/_backend_tk.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import uuid
2+
import weakref
23
from contextlib import contextmanager
34
import logging
45
import math
@@ -198,14 +199,33 @@ def __init__(self, figure=None, master=None):
198199
# event to the window containing the canvas instead.
199200
# See https://wiki.tcl-lang.org/3893 (mousewheel) for details
200201
root = self._tkcanvas.winfo_toplevel()
201-
root.bind("<MouseWheel>", self.scroll_event_windows, "+")
202+
203+
# Prevent long-lived references via tkinter callback structure GH-24820
204+
weakself = weakref.ref(self)
205+
weakroot = weakref.ref(root)
206+
207+
def scroll_event_windows(event):
208+
self = weakself()
209+
if self is None:
210+
root = weakroot()
211+
if root is not None:
212+
root.unbind("<MouseWheel>", scroll_event_windows_id)
213+
return
214+
return self.scroll_event_windows(event)
215+
scroll_event_windows_id = root.bind("<MouseWheel>", scroll_event_windows, "+")
202216

203217
# Can't get destroy events by binding to _tkcanvas. Therefore, bind
204218
# to the window and filter.
205219
def filter_destroy(event):
220+
self = weakself()
221+
if self is None:
222+
root = weakroot()
223+
if root is not None:
224+
root.unbind("<Destroy>", filter_destroy_id)
225+
return
206226
if event.widget is self._tkcanvas:
207227
CloseEvent("close_event", self)._process()
208-
root.bind("<Destroy>", filter_destroy, "+")
228+
filter_destroy_id = root.bind("<Destroy>", filter_destroy, "+")
209229

210230
self._tkcanvas.focus_set()
211231

0 commit comments

Comments
 (0)