Skip to content

Commit

Permalink
Merge pull request #25170 from meeseeksmachine/auto-backport-of-pr-25…
Browse files Browse the repository at this point in the history
…097-on-v3.7.x
  • Loading branch information
ksunden committed Feb 10, 2023
2 parents 53a4b88 + 9ddd37a commit 12b1dc2
Showing 1 changed file with 22 additions and 2 deletions.
24 changes: 22 additions & 2 deletions lib/matplotlib/backends/_backend_tk.py
@@ -1,4 +1,5 @@
import uuid
import weakref
from contextlib import contextmanager
import logging
import math
Expand Down Expand Up @@ -198,14 +199,33 @@ def __init__(self, figure=None, master=None):
# event to the window containing the canvas instead.
# See https://wiki.tcl-lang.org/3893 (mousewheel) for details
root = self._tkcanvas.winfo_toplevel()
root.bind("<MouseWheel>", self.scroll_event_windows, "+")

# Prevent long-lived references via tkinter callback structure GH-24820
weakself = weakref.ref(self)
weakroot = weakref.ref(root)

def scroll_event_windows(event):
self = weakself()
if self is None:
root = weakroot()
if root is not None:
root.unbind("<MouseWheel>", scroll_event_windows_id)
return
return self.scroll_event_windows(event)
scroll_event_windows_id = root.bind("<MouseWheel>", scroll_event_windows, "+")

# Can't get destroy events by binding to _tkcanvas. Therefore, bind
# to the window and filter.
def filter_destroy(event):
self = weakself()
if self is None:
root = weakroot()
if root is not None:
root.unbind("<Destroy>", filter_destroy_id)
return
if event.widget is self._tkcanvas:
CloseEvent("close_event", self)._process()
root.bind("<Destroy>", filter_destroy, "+")
filter_destroy_id = root.bind("<Destroy>", filter_destroy, "+")

self._tkcanvas.focus_set()

Expand Down

0 comments on commit 12b1dc2

Please sign in to comment.