Extend _close() to break cycles.
Break some other cycles too (and destroy the root when done).
diff --git a/Tools/idle/PyShell.py b/Tools/idle/PyShell.py
index a618ad1..90f9b2c 100644
--- a/Tools/idle/PyShell.py
+++ b/Tools/idle/PyShell.py
@@ -363,12 +363,13 @@
         # Helper for ModifiedInterpreter
         self.resetoutput()
         self.executing = 1
-        self._cancel_check = self.cancel_check
+        ##self._cancel_check = self.cancel_check
         ##sys.settrace(self._cancel_check)
 
     def endexecuting(self):
         # Helper for ModifiedInterpreter
-        sys.settrace(None)
+        ##sys.settrace(None)
+        ##self._cancel_check = None
         self.executing = 0
         self.canceled = 0
 
@@ -386,17 +387,20 @@
             if self.reading:
                 self.top.quit()
             return "cancel"
-        reply = PyShellEditorWindow.close(self)
-        if reply != "cancel":
-            self.flist.pyshell = None
-            # Restore std streams
-            sys.stdout = self.save_stdout
-            sys.stderr = self.save_stderr
-            sys.stdin = self.save_stdin
-            # Break cycles
-            self.interp = None
-            self.console = None
-        return reply
+        return PyShellEditorWindow.close(self)
+
+    def _close(self):
+        # Restore std streams
+        sys.stdout = self.save_stdout
+        sys.stderr = self.save_stderr
+        sys.stdin = self.save_stdin
+        # Break cycles
+        self.interp = None
+        self.console = None
+        self.auto = None
+        self.flist.pyshell = None
+        self.history = None
+        OutputWindow._close(self) # Really EditorWindow._close
 
     def ispythonsource(self, filename):
         # Override this so EditorWindow never removes the colorizer
@@ -731,6 +735,7 @@
 
     shell.begin()
     root.mainloop()
+    root.destroy()
 
 
 if __name__ == "__main__":