10000 clean up tkinter variable trace · matplotlib/matplotlib@a3016af · GitHub
[go: up one dir, main page]

Skip to content

Commit a3016af

Browse files
clean up tkinter variable trace
tkinter variables get cleaned up with normal `destroy` and `gc` semantics but tkinter's implementation of trace is effectively global and keeps the callback object alive until the trace is removed.
1 parent a1f2e5f commit a3016af

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

lib/matplotlib/backends/_backend_tk.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -423,11 +423,12 @@ def __init__(self, canvas, num, window):
423423
# to store the DPI, which will be updated by the C code, and the trace
424424
# will handle it on the Python side.
425425
window_frame = int(window.wm_frame(), 16)
426-
window_dpi = tk.IntVar(master=window, value=96,
426+
self._window_dpi = tk.IntVar(master=window, value=96,
427427
name=f'window_dpi{window_frame}')
428+
self._window_dpi_cbname = ''
428429
if _tkagg.enable_dpi_awareness(window_frame, window.tk.interpaddr()):
429-
self._window_dpi = window_dpi # Prevent garbage collection.
430-
window_dpi.trace_add('write', self._update_window_dpi)
430+
self._window_dpi_cbname = self._window_dpi.trace_add(
431+
'write', self._update_window_dpi)
431432

432433
self._shown = False
433434

@@ -472,6 +473,8 @@ def destroy(self, *args):
472473
self.canvas._tkcanvas.after_cancel(self.canvas._idle_draw_id)
473474
if self.canvas._event_loop_id:
474475
self.canvas._tkcanvas.after_cancel(self.canvas._event_loop_id)
476+
if self._window_dpi_cbname:
477+
self._window_dpi.trace_remove('write', self._window_dpi_cbname)
475478

476479
# NOTE: events need to be flushed before issuing destroy (GH #9956),
477480
# however, self.window.update() can break user code. An async callback

0 commit comments

Comments
 (0)
0