Skip to content

Commit

Permalink
[3.13] gh-112938: IDLE - Fix uninteruptable hang when Shell gets rapi…
Browse files Browse the repository at this point in the history
…d continuous output. (GH-124310) (#124318)

gh-112938: IDLE - Fix uninteruptable hang when Shell gets rapid continuous output. (GH-124310)

python/cpython#88496 replaced text.update with text.update_idletasks in colorizer.py and outwin.py to fix test failures on macOS.  While theoretically correct, the result was Shell freezing when receiving continuous short strings to print.  Test: `while 1: 1`.

The guess is that there is no idle time in which to do the screen update.  Reverting the change in one of the files,
outwin, fixes the issue.  Colorizer runs ever 1/20 second and seems to work fine.

When running test-outwin on macOS, alias 'update'
to 'update_idletasks on the text used for testing.
(cherry picked from commit 55a5a93)

Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
  • Loading branch information
miss-islington and terryjreedy authored Sep 27, 2024
1 parent 9c7cca5 commit 00127a6
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 1 deletion.
5 changes: 5 additions & 0 deletions idlelib/idle_test/test_outwin.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"Test outwin, coverage 76%."

from idlelib import outwin
import sys
import unittest
from test.support import requires
from tkinter import Tk, Text
Expand All @@ -18,6 +19,10 @@ def setUpClass(cls):
root.withdraw()
w = cls.window = outwin.OutputWindow(None, None, None, root)
cls.text = w.text = Text(root)
if sys.platform == 'darwin': # Issue 112938
cls.text.update = cls.text.update_idletasks
# Without this, test write, writelines, and goto... fail.
# The reasons and why macOS-specific are unclear.

@classmethod
def tearDownClass(cls):
Expand Down
2 changes: 1 addition & 1 deletion idlelib/outwin.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ def write(self, s, tags=(), mark="insert"):
assert isinstance(s, str)
self.text.insert(mark, s, tags)
self.text.see(mark)
self.text.update_idletasks()
self.text.update()
return len(s)

def writelines(self, lines):
Expand Down

0 comments on commit 00127a6

Please sign in to comment.