]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-123193: Document tkinter Variable lifetime (GH-152625)
authorSerhiy Storchaka <storchaka@gmail.com>
Sun, 5 Jul 2026 11:07:12 +0000 (14:07 +0300)
committerGitHub <noreply@github.com>
Sun, 5 Jul 2026 11:07:12 +0000 (14:07 +0300)
A Tk variable wrapper unsets its Tcl variable when garbage collected, so a
reference must be kept while a widget uses it.  Otherwise Tk recreates the Tcl
variable but never unsets it again, leaking it.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Doc/library/tkinter.rst

index 8c4678b4b23c778e9d439a8887f2e23ecd8e3d76..b84d76b72d2e5b5d0da2498f200e22d8aaaa5c16 100644 (file)
@@ -656,6 +656,9 @@ method on it, and to change its value you call the :meth:`!set` method.
 If you follow this protocol, the widget will always track the value of the
 variable, with no further intervention on your part.
 
+Keep a reference to the variable for as long as a widget uses it, for example
+by storing it as an attribute (see :class:`Variable`).
+
 For example::
 
    import tkinter as tk
@@ -5916,6 +5919,14 @@ Variable classes
    :class:`StringVar`, :class:`IntVar`, :class:`DoubleVar` or
    :class:`BooleanVar` -- rather than :class:`!Variable` directly.
 
+   .. note::
+
+      When a :class:`!Variable` is garbage collected, its Tcl variable is unset.
+      Keep a reference to it for as long as a widget is linked to it, for example
+      by storing it as an attribute rather than in a local variable.
+      Otherwise Tk recreates the Tcl variable to keep the widget working, but it
+      is never unset again, leaking one Tcl variable per dropped wrapper.
+
    .. versionchanged:: 3.10
       Two variables now compare equal (``==``) only when they have the same
       name, are of the same class, and belong to the same Tcl interpreter.