Skip to content

Commit 10afdf1

Browse files
committed
gh-91167: Fix cloned turtle pen not clearing completely
When calling clear() on a cloned turtle, it incorrectly cleared the source turtle's drawings instead of its own. Fix by reinitializing the clone's currentLine and items to track only its own drawing state.
1 parent 1ac9d13 commit 10afdf1

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

Lib/test/test_turtle.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,21 @@ def test_dot_signature(self):
671671
self.assertRaises(turtle.TurtleGraphicsError, self.turtle.dot, 0, (0, 257, 0))
672672
self.assertRaises(turtle.TurtleGraphicsError, self.turtle.dot, 0, 0, 257, 0)
673673

674+
def test_clone_clear_does_not_delete_source_items(self):
675+
screen = self.turtle.screen
676+
screen._delete.reset_mock()
677+
screen._createline.side_effect = lambda: object()
678+
679+
self.turtle.circle(20)
680+
clone = self.turtle.clone()
681+
source_items = set(self.turtle.items)
682+
683+
clone.forward(50)
684+
clone.clear()
685+
686+
deleted_items = {call.args[0] for call in screen._delete.call_args_list}
687+
self.assertFalse(source_items & deleted_items)
688+
674689
class TestModuleLevel(unittest.TestCase):
675690
def test_all_signatures(self):
676691
import inspect

Lib/turtle.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2879,6 +2879,8 @@ def clone(self):
28792879
q.turtle._item = [screen._createpoly() for item in
28802880
screen._shapes[self.turtle.shapeIndex]._data]
28812881
q.currentLineItem = screen._createline()
2882+
q.currentLine = [q._position] if q._drawing else []
2883+
q.items = [q.currentLineItem]
28822884
q._update()
28832885
return q
28842886

0 commit comments

Comments
 (0)