diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 802f0248e4e459..2725043b4ed925 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -1,6 +1,6 @@ """ idlelib.run -Simplified, pyshell.ModifiedInterpreter spawns a subprocess with +Simplified: pyshell.ModifiedInterpreter spawns a subprocess with f'''{sys.executable} -c "__import__('idlelib.run').run.main()"''' '.run' is needed because __import__ returns idlelib, not idlelib.run. """ @@ -26,11 +26,12 @@ from idlelib import rpc # multiple objects from idlelib import stackviewer # StackTreeItem from idlelib import util # fix_scaling -import __main__ +import __main__ # self.locals in Executive.__init__. import tkinter # Use tcl and, if startup fails, messagebox. -if not hasattr(sys.modules['idlelib.run'], 'firstrun'): - # Undo modifications of tkinter by idlelib imports; see bpo-25507. + +def scrub_tkinter_submodules(): # Call in main when starting user process. + # Undo modifications of tkinter by idlelib imports; see gh-69693. # Which of these submodules got imported (and thus added as a tkinter # attribute) depends on what idlelib pulled in, so tolerate missing # ones rather than assuming a fixed set; see gh-59396. @@ -42,8 +43,6 @@ del sys.modules['tkinter.' + mod] except (AttributeError, KeyError): pass - # Avoid AttributeError if run again; see bpo-37038. - sys.modules['idlelib.run'].firstrun = False LOCALHOST = '127.0.0.1' @@ -139,6 +138,9 @@ def main(del_exitfunc=False): register and unregister themselves. """ + + scrub_tkinter_submodules() + global exit_now global quitting global no_exitfunc @@ -705,8 +707,7 @@ def stackviewer(self, flist_oid=None): item = stackviewer.StackTreeItem(exc, flist) return debugobj_r.remote_object_tree_item(item) - -if __name__ == '__main__': +if __name__ == '__main__': # __name__ is 'idlelib.run' in user subprocess. from unittest import main main('idlelib.idle_test.test_run', verbosity=2) diff --git a/Misc/NEWS.d/next/IDLE/2026-09-03-17-16-26.gh-issue-156896.XTQJlq.rst b/Misc/NEWS.d/next/IDLE/2026-09-03-17-16-26.gh-issue-156896.XTQJlq.rst new file mode 100644 index 00000000000000..fd759cdbe92c2f --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2026-09-03-17-16-26.gh-issue-156896.XTQJlq.rst @@ -0,0 +1 @@ +Stop deleting tkinter submodules when idlelib.run is imported.