Skip to content

gh-123193: Document tkinter Variable lifetime#152625

Merged
serhiy-storchaka merged 1 commit into
python:mainfrom
serhiy-storchaka:gh-123193-variable-lifetime-docs
Jul 5, 2026
Merged

gh-123193: Document tkinter Variable lifetime#152625
serhiy-storchaka merged 1 commit into
python:mainfrom
serhiy-storchaka:gh-123193-variable-lifetime-docs

Conversation

@serhiy-storchaka

Copy link
Copy Markdown
Member

A Tk variable wrapper (StringVar, IntVar, ...) unsets its Tcl variable when the Python object is garbage collected.
If the wrapper is dropped while a widget still references it (through variable/textvariable), Tk recreates the Tcl variable to keep the widget working, but it is then no longer managed by Python and is never unset again — so it leaks.

This is the cause of gh-123193: dynamically creating widgets whose Variable objects are kept only in local variables (and thus collected while the widgets live on) steadily accumulates orphaned PY_VAR* Tcl globals.
It is the documented "keep a reference to your Variable" footgun rather than a fixable _tkinter bug, so this just documents the lifetime contract — on the coupling-widget-variables tutorial and on the Variable class.

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>
@bedevere-app bedevere-app Bot added docs Documentation in the Doc dir skip news labels Jun 29, 2026
@github-project-automation github-project-automation Bot moved this to Todo in Docs PRs Jun 29, 2026
@serhiy-storchaka serhiy-storchaka added needs backport to 3.13 bugs and security fixes needs backport to 3.14 bugs and security fixes needs backport to 3.15 pre-release feature fixes, bugs and security fixes labels Jun 29, 2026
@read-the-docs-community

Copy link
Copy Markdown

Documentation build overview

📚 cpython-previews | 🛠️ Build #33361209 | 📁 Comparing 2b9878a against main (089e6f6)

  🔍 Preview build  

1 file changed
± library/tkinter.html

@serhiy-storchaka serhiy-storchaka merged commit 820b6ca into python:main Jul 5, 2026
42 checks passed
@github-project-automation github-project-automation Bot moved this from Todo to Done in Docs PRs Jul 5, 2026
@miss-islington-app

Copy link
Copy Markdown

Thanks @serhiy-storchaka for the PR 🌮🎉.. I'm working now to backport this PR to: 3.13, 3.14, 3.15.
🐍🍒⛏🤖

@serhiy-storchaka serhiy-storchaka deleted the gh-123193-variable-lifetime-docs branch July 5, 2026 11:07
@bedevere-app

bedevere-app Bot commented Jul 5, 2026

Copy link
Copy Markdown

GH-153098 is a backport of this pull request to the 3.15 branch.

@bedevere-app bedevere-app Bot removed the needs backport to 3.15 pre-release feature fixes, bugs and security fixes label Jul 5, 2026
@bedevere-app

bedevere-app Bot commented Jul 5, 2026

Copy link
Copy Markdown

GH-153099 is a backport of this pull request to the 3.14 branch.

@bedevere-app bedevere-app Bot removed the needs backport to 3.14 bugs and security fixes label Jul 5, 2026
@bedevere-app

bedevere-app Bot commented Jul 5, 2026

Copy link
Copy Markdown

GH-153100 is a backport of this pull request to the 3.13 branch.

@bedevere-app bedevere-app Bot removed the needs backport to 3.13 bugs and security fixes label Jul 5, 2026
serhiy-storchaka added a commit that referenced this pull request Jul 5, 2026
…153100)

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 820b6ca)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
serhiy-storchaka added a commit that referenced this pull request Jul 5, 2026
…153099)

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 820b6ca)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
serhiy-storchaka added a commit that referenced this pull request Jul 5, 2026
…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 820b6ca)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Documentation in the Doc dir skip news

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant