Skip to content

gh-139145: Fix tkinter event loop in interactive mode#152257

Merged
serhiy-storchaka merged 1 commit into
python:mainfrom
serhiy-storchaka:tkinter-eventhook-minimal
Jun 26, 2026
Merged

gh-139145: Fix tkinter event loop in interactive mode#152257
serhiy-storchaka merged 1 commit into
python:mainfrom
serhiy-storchaka:tkinter-eventhook-minimal

Conversation

@serhiy-storchaka

Copy link
Copy Markdown
Member

This fixes two related bugs in the interactive-mode input hook (EventHook in Modules/_tkinter.c), with minimal changes and without requiring a thread-enabled Tcl, so it remains backportable.

gh-139145: when a Tcl command running its own event loop (such as vwait or wait_variable) is active and input arrives on stdin, the loop kept spinning at 100% CPU. The stdin file handler is now removed as soon as input becomes available, in MyFileProc, so a nested loop no longer keeps waking on the same unread input.

gh-139816: an exception raised in a callback made EventHook return to the prompt, where (on a build without readline) it blocks in fgets until the user presses Enter, starving later callbacks. The exception is now reported inline and the loop keeps pumping until stdin actually has input.

The handler is deleted on every loop-exit path, and the descriptor is passed by value through clientData rather than as a pointer to a stack variable, so no stack address can outlive EventHook.

This builds on @mdehoon's #139180 (gh-139145) and a suggestion there from @chrstphrchvz; both are credited as co-authors. It supersedes #139180 by also covering gh-139816 and closing the result < 0 exit path.

No test is included: the spin and the without-readline hang both depend on the platform notifier and on timing/load, so a reliable, non-flaky regression test isn't practical across CI configurations.

Also fixes gh-139816.

When a Tcl command running its own event loop (such as vwait or
wait_variable) was active and the user typed input on stdin, the event
loop kept spinning at 100% CPU.  The stdin file handler is now removed as
soon as input becomes available.

Also fix pythongh-139816: an exception raised in a callback no longer stops the
event loop to wait for Enter on a Python built without readline; pending
callbacks keep running until input is actually available on stdin.

Co-authored-by: mdehoon <mjldehoon@yahoo.com>
Co-authored-by: Christopher Chavez <chrischavez@gmx.us>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@mdehoon

mdehoon commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

@serhiy-storchaka Looks good to me, thanks!

@serhiy-storchaka serhiy-storchaka merged commit 3ffda34 into python:main Jun 26, 2026
106 of 108 checks passed
@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 tkinter-eventhook-minimal branch June 26, 2026 14:14
@bedevere-app

bedevere-app Bot commented Jun 26, 2026

Copy link
Copy Markdown

GH-152291 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 Jun 26, 2026
@bedevere-app

bedevere-app Bot commented Jun 26, 2026

Copy link
Copy Markdown

GH-152292 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 Jun 26, 2026
@bedevere-app

bedevere-app Bot commented Jun 26, 2026

Copy link
Copy Markdown

GH-152293 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 Jun 26, 2026
serhiy-storchaka added a commit that referenced this pull request Jun 26, 2026
…) (GH-152291)

When a Tcl command running its own event loop (such as vwait or
wait_variable) was active and the user typed input on stdin, the event
loop kept spinning at 100% CPU.  The stdin file handler is now removed as
soon as input becomes available.

Also fix gh-139816: an exception raised in a callback no longer stops the
event loop to wait for Enter on a Python built without readline; pending
callbacks keep running until input is actually available on stdin.
(cherry picked from commit 3ffda34)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: mdehoon <mjldehoon@yahoo.com>
Co-authored-by: Christopher Chavez <chrischavez@gmx.us>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
serhiy-storchaka added a commit that referenced this pull request Jun 26, 2026
…) (GH-152292)

When a Tcl command running its own event loop (such as vwait or
wait_variable) was active and the user typed input on stdin, the event
loop kept spinning at 100% CPU.  The stdin file handler is now removed as
soon as input becomes available.

Also fix gh-139816: an exception raised in a callback no longer stops the
event loop to wait for Enter on a Python built without readline; pending
callbacks keep running until input is actually available on stdin.
(cherry picked from commit 3ffda34)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: mdehoon <mjldehoon@yahoo.com>
Co-authored-by: Christopher Chavez <chrischavez@gmx.us>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
serhiy-storchaka added a commit that referenced this pull request Jun 26, 2026
…) (GH-152293)

When a Tcl command running its own event loop (such as vwait or
wait_variable) was active and the user typed input on stdin, the event
loop kept spinning at 100% CPU.  The stdin file handler is now removed as
soon as input becomes available.

Also fix gh-139816: an exception raised in a callback no longer stops the
event loop to wait for Enter on a Python built without readline; pending
callbacks keep running until input is actually available on stdin.
(cherry picked from commit 3ffda34)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: mdehoon <mjldehoon@yahoo.com>
Co-authored-by: Christopher Chavez <chrischavez@gmx.us>
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

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Interactive python without readline hangs in case of a PythonCmd_Error in tkinter.

2 participants