mirror of
https://github.com/python/cpython.git
synced 2026-07-23 18:36:26 -04:00
[3.15] gh-123193: Document tkinter Variable lifetime (GH-152625) (GH-153098)
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.
(cherry picked from commit 820b6ca22d)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
committed by
GitHub
parent
67d782c6bc
commit
a862fbc7f0
@@ -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
|
||||
@@ -5736,6 +5739,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.
|
||||
|
||||
Reference in New Issue
Block a user