FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

gh-139145: Fix tkinter event loop in interactive mode by serhiy-storchaka · Pull Request #152257 · python/cpython · GitHub

Repository navigation

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

serhiy-storchaka merged 1 commit into
python:mainfrom
serhiy-storchaka:tkinter-eventhook-minimal

Conversation

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 commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

@serhiy-storchaka Looks good to me, thanks!

serhiy-storchaka merged commit 3ffda34 into python:main Jun 26, 2026
106 of 108 checks passed

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 deleted the tkinter-eventhook-minimal branch June 26, 2026 14:14

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 Bot removed the needs backport to 3.15 bugs and security fixes label Jun 26, 2026

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 Bot removed the needs backport to 3.14 bugs and security fixes label Jun 26, 2026

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 Bot removed the needs backport to 3.13 only 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
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


Back | FazBrowse Home | New Git URL