Override the Undo delegator to forbid any changes before the I/O mark.
It beeps if you try to insert or delete before the "iomark" mark.
This makes the shell less confusing for newbies.
diff --git a/Tools/idle/PyShell.py b/Tools/idle/PyShell.py
index 6e26738..cbd7d66 100644
--- a/Tools/idle/PyShell.py
+++ b/Tools/idle/PyShell.py
@@ -15,6 +15,7 @@
 from EditorWindow import EditorWindow, fixwordbreaks
 from FileList import FileList
 from ColorDelegator import ColorDelegator
+from UndoDelegator import UndoDelegator
 from OutputWindow import OutputWindow
 from IdleConf import idleconf
 import idlever
@@ -127,6 +128,28 @@
     })
 
 
+class ModifiedUndoDelegator(UndoDelegator):
+
+    # Forbid insert/delete before the I/O mark
+
+    def insert(self, index, chars, tags=None):
+        try:
+            if self.delegate.compare(index, "<", "iomark"):
+                self.delegate.bell()
+                return
+        except TclError:
+            pass
+        UndoDelegator.insert(self, index, chars, tags)
+
+    def delete(self, index1, index2=None):
+        try:
+            if self.delegate.compare(index1, "<", "iomark"):
+                self.delegate.bell()
+                return
+        except TclError:
+            pass
+        UndoDelegator.delete(self, index1, index2)
+
 class ModifiedInterpreter(InteractiveInterpreter):
 
     def __init__(self, tkconsole):
@@ -264,6 +287,7 @@
 
     # Override classes
     ColorDelegator = ModifiedColorDelegator
+    UndoDelegator = ModifiedUndoDelegator
 
     # Override menu bar specs
     menu_specs = PyShellEditorWindow.menu_specs[:]