Python Turtle Tutorial: The Best Beginner Drawing Tool

Turtle is one of Python’s most approachable learning tools because every line of code produces a visible result. Instead of reading a number in the terminal, beginners can watch a turtle move, turn, draw, and repeat.

A first exercise can draw a square: move forward, turn 90 degrees, and repeat four times. From there, change the angle and repetition count to create polygons, spirals, and geometric patterns. The important lesson is not the picture; it is the relationship between a loop, a parameter, and an outcome.

Turtle also introduces functions naturally. Create a draw_polygon(sides, length) function, calculate the turn angle, and reuse it for triangles, pentagons, and stars. Add color and speed only after the geometry works.

Compared with a game library, Turtle has a smaller surface area and fewer distractions. That makes it ideal for a first weekend with Python. It teaches state, sequencing, repetition, and debugging while keeping the feedback immediate.

When learners are ready for animation, keyboard input, and game loops, Pygame is a logical next step. Turtle is not a toy to outgrow; it is a clear first model of programming through visual feedback.


3. The Turtle Graphics Coordinate System

Understanding the coordinate system is crucial. By default:

  • (0,0) is the center of the screen.
  • Right: +x direction (east)
  • Left: -x direction (west)
  • Up: +y direction (north)
  • Down: -y direction (south)
  • Initial heading: 0 degrees (east)
# Query current position and heading
print(turtle.position())   # (0.00,0.00)
print(turtle.heading())    # 0.0

You can teleport the turtle without drawing:

turtle.penup()
turtle.goto(200, 150)  # absolute coordinates
turtle.goto(-100, -200)
turtle.pendown()

4. Core Movement Commands (Complete Reference)

Forward and Backward

CommandAliasDescription
turtle.forward(distance)turtle.fd(distance)Moves turtle forward by given pixels
turtle.backward(distance)turtle.bk(distance) turtle.back(distance)Moves turtle backward
turtle.fd(50)   # moves forward 50 pixels
turtle.bk(30)   # moves back 30 pixels

Turning and Rotation

CommandDescription
turtle.right(angle)Turns turtle clockwise
turtle.left(angle)Turns turtle counter-clockwise
turtle.setheading(angle)Sets absolute heading (0=east, 90=north, 180=west, 270=south)
turtle.heading()Returns current heading
turtle.setheading(90)  # Face north
turtle.left(45)        # Turn 45 degrees counter-clockwise
turtle.right(90)       # Turn 90 degrees clockwise

Circle and Arc Drawing

turtle.circle(radius, extent=None, steps=None)
  • radius: Positive = center left of turtle; Negative = center right
  • extent: Angle in degrees (default 360 = full circle)
  • steps: Number of polygon sides (creates regular polygon)
turtle.circle(50)          # Full circle
turtle.circle(50, 180)     # Semicircle
turtle.circle(50, 90)      # Quarter circle
turtle.circle(50, None, 6) # Hexagon

Dot and Stamp

turtle.dot(size, color)  # Draw a filled circle at current position
turtle.stamp()           # Leaves an impression, returns stamp ID
turtle.clearstamp(stamp_id)  # Remove specific stamp
turtle.clearstamps(n)    # Remove last n stamps (or all if n=None)

5. Pen Control and Drawing State

The pen state determines whether movement draws lines.

Pen Up/Down

CommandEffect
turtle.penup()Lifts pen (move without drawing)
turtle.pendown()Lowers pen (draw while moving)
turtle.isdown()Returns True if pen is down

Pen Properties

CommandDescription
turtle.pensize(width)Sets line thickness in pixels
turtle.pencolor(color)Sets line color
turtle.speed(speed)0=fastest, 10=fast, 6=normal, 3=slow, 1=slowest

Speed reference:

  • "fastest" / 0 : no animation
  • "fast" / 10 : fast
  • "normal" / 6 : normal
  • "slow" / 3 : slow
  • "slowest" / 1 : slowest
turtle.pensize(5)
turtle.pencolor("red")
turtle.speed(3)  # Slow, visible drawing

Resetting the Screen

CommandEffect
turtle.reset()Clears drawings, resets position and state to default
turtle.clear()Clears drawings but keeps turtle position
turtle.home()Moves turtle to (0,0) facing east (0°) without clearing

6. Color, Fill, and Styling

Colors

Colors can be specified as:

  • String: "red", "blue", "green", "cyan", "magenta", "yellow", "black", "white"
  • RGB tuple (0 to 1): (0.2, 0.5, 0.8)
  • Hex: "#FF5733"
turtle.pencolor("purple")
turtle.fillcolor("orange")
turtle.color("red", "blue")  # Outline red, fill blue

Filling Shapes

turtle.begin_fill()
# Draw shape
for _ in range(4):
    turtle.forward(100)
    turtle.right(90)
turtle.end_fill()

Advanced Color Modes

turtle.colormode(255)  # Switch to 0-255 RGB range
turtle.pencolor(128, 64, 255)  # Purple-blue

7. Position and State Queries

These functions are essential for debugging and conditional logic.

FunctionReturns
turtle.position()(x, y) tuple
turtle.xcor()x-coordinate as float
turtle.ycor()y-coordinate as float
turtle.heading()Current heading in degrees
turtle.distance(x, y)Distance to point or another turtle
turtle.towards(x, y)Angle towards point from current position
turtle.isvisible()Boolean
turtle.pen()Dictionary of pen settings
if turtle.xcor() > 200:
    turtle.setheading(180)  # Turn around

8. Control Structures with Turtle

Turtle integrates seamlessly with Python’s control flow.

Loops

# Square with a for loop
for _ in range(4):
    turtle.forward(100)
    turtle.right(90)

# Spiral
for length in range(10, 200, 10):
    turtle.forward(length)
    turtle.right(90)

Conditionals

if turtle.xcor() > 300:
    turtle.goto(-300, turtle.ycor())

Recursion (Fractals)

def tree(branch_len, t):
    if branch_len > 5:
        t.forward(branch_len)
        t.right(20)
        tree(branch_len - 15, t)
        t.left(40)
        tree(branch_len - 15, t)
        t.right(20)
        t.backward(branch_len)

9. Event Handling and Keyboard/Mouse Input

Turn your drawing into an interactive application.

Keyboard Binding

def move_forward():
    turtle.forward(20)

screen = turtle.Screen()
screen.onkey(move_forward, "Up")
screen.listen()  # Must call listen() for keyboard events

Common keys: "Up", "Down", "Left", "Right", "space", "a", "1", etc.

Mouse Events

def draw_at_click(x, y):
    turtle.penup()
    turtle.goto(x, y)
    turtle.pendown()
    turtle.dot(10, "red")

screen.onclick(draw_at_click)

# Mouse movement
def track_motion(x, y):
    screen.title(f"Mouse at: ({x}, {y})")

screen.onmousemotion(track_motion)

Timer Events (Animation)

def animate():
    turtle.forward(5)
    if turtle.xcor() > 300:
        turtle.setheading(180)
    elif turtle.xcor() < -300:
        turtle.setheading(0)
    screen.ontimer(animate, 20)  # Call again after 20ms

animate()

10. Advanced Turtle: Screen Setup, Modes, and World Coordinates

Screen Configuration

screen = turtle.Screen()
screen.setup(width=800, height=600, startx=100, starty=100)
screen.title("Advanced Turtle")
screen.bgcolor("black")
screen.bgpic("background.gif")  # GIF only
screen.clear()  # Clears screen
screen.clearscreen()  # Also resets turtles

Multiple Turtles

t1 = turtle.Turtle()
t2 = turtle.Turtle()
t1.color("red")
t2.color("blue")
t1.goto(-100, 0)
t2.goto(100, 0)

for _ in range(36):
    t1.forward(10)
    t1.left(10)
    t2.backward(10)
    t2.right(10)

Tracer and Update (Bulk Drawing)

screen.tracer(0)  # Turn off automatic updates
for _ in range(100):
    turtle.forward(1)
    turtle.right(3.6)
screen.update()  # Render all at once

World Coordinates (Custom Coordinate System)

screen.setworldcoordinates(-100, -100, 100, 100)
# Now (-100,-100) is bottom-left, (100,100) is top-right

Hiding and Showing Turtle

turtle.hideturtle()
turtle.showturtle()
turtle.isvisible()  # Returns boolean

Custom Shape

screen.register_shape("arrowhead", ((0,0), (10,20), (-10,20)))
turtle.shape("arrowhead")

11. Performance Optimization and Animation

Common Performance Pitfalls

  1. Slow drawing: Use turtle.speed(0) for instant movement.
  2. Flickering: Batch drawing with tracer(0) and update().
  3. Unresponsive events: Always call screen.listen() before onkey().

Smooth Animation Loop Template

import turtle

screen = turtle.Screen()
screen.tracer(0)
player = turtle.Turtle()
player.shape("turtle")

dx, dy = 2, 2

def animate():
    global dx, dy
    x, y = player.position()

    # Bounce off walls
    if x > 300 or x < -300:
        dx = -dx
    if y > 300 or y < -300:
        dy = -dy

    player.goto(x + dx, y + dy)
    screen.update()
    screen.ontimer(animate, 10)

animate()
screen.mainloop()

12. Complete Example Projects

Project 1: Colorful Spiral

import turtle

t = turtle.Turtle()
t.speed(0)
colors = ["red", "orange", "yellow", "green", "blue", "purple"]

for i in range(360):
    t.pencolor(colors[i % 6])
    t.width(i / 100 + 1)
    t.forward(i)
    t.left(59)

turtle.done()

Project 2: Interactive Drawing Pad

import turtle

screen = turtle.Screen()
screen.setup(800, 600)
screen.title("Draw with Arrow Keys")
screen.bgcolor("white")

drawer = turtle.Turtle()
drawer.speed(0)
drawer.pensize(3)

def up(): drawer.setheading(90); drawer.forward(10)
def down(): drawer.setheading(270); drawer.forward(10)
def left(): drawer.setheading(180); drawer.forward(10)
def right(): drawer.setheading(0); drawer.forward(10)
def change_color():
    colors = ["red", "blue", "green", "purple", "orange"]
    drawer.pencolor(colors.pop())
def clear_screen():
    drawer.clear()
    drawer.penup()
    drawer.home()
    drawer.pendown()

screen.onkey(up, "Up")
screen.onkey(down, "Down")
screen.onkey(left, "Left")
screen.onkey(right, "Right")
screen.onkey(change_color, "c")
screen.onkey(clear_screen, "space")
screen.listen()
screen.mainloop()

Project 3: Clock Face

import turtle
import time

screen = turtle.Screen()
screen.setup(400, 400)
screen.tracer(0)

clock = turtle.Turtle()
clock.speed(0)
clock.hideturtle()

for hour in range(12):
    angle = hour * 30
    x = 150 * turtle.math.cos(angle * turtle.math.pi / 180)
    y = 150 * turtle.math.sin(angle * turtle.math.pi / 180)
    clock.penup()
    clock.goto(x, y)
    clock.pendown()
    clock.write(str(hour if hour != 0 else 12), align="center", font=("Arial", 14, "bold"))

hands = turtle.Turtle()
hands.speed(0)
hands.hideturtle()

def update_clock():
    hands.clear()
    t = time.localtime()
    seconds = t.tm_sec
    minutes = t.tm_min
    hours = t.tm_hour % 12

    sec_angle = 90 - (seconds * 6)
    min_angle = 90 - (minutes * 6 + seconds * 0.1)
    hour_angle = 90 - (hours * 30 + minutes * 0.5)

    hands.penup()
    hands.goto(0, 0)
    hands.pendown()

    hands.setheading(sec_angle)
    hands.forward(120)
    hands.penup()
    hands.goto(0, 0)
    hands.setheading(min_angle)
    hands.forward(100)
    hands.penup()
    hands.goto(0, 0)
    hands.setheading(hour_angle)
    hands.forward(70)

    screen.update()
    screen.ontimer(update_clock, 1000)

update_clock()
screen.mainloop()

13. Troubleshooting Common Errors

ErrorCauseSolution
TerminatorAttempting to use turtle after bye() or window closedRestart kernel, use turtle.bye() correctly
turtle.TurtleScreen not respondingForgot screen.listen() for keyboard eventsAdd screen.listen() before onkey()
Window closes immediatelyMissing turtle.done() or mainloop()Add turtle.done() at script end
Slow performanceDrawing each step individuallyUse screen.tracer(0) and screen.update()
Colors not showingWrong color modeSet turtle.colormode(255) for 0-255 RGB
Turtle invisibleCalled hideturtle()Use showturtle()
Unexpected drawing linesForgot penup() before goto()Always penup() before teleporting

Debugging Tip

Use turtle.write() to display variable values on screen:

turtle.write(f"Position: {turtle.position()}", font=("Arial", 12, "normal"))

14. Conclusion and Further Resources

Python’s Turtle module is a hidden gem: simple enough for absolute beginners yet capable of creating complex fractals, interactive games, and geometric art. By mastering these commands—from basic movement to event handling and animation—you’ve built a strong foundation in both graphics programming and Python itself.

Additional Resources

  • Official Documentation: docs.python.org/3/library/turtle.html
  • Turtle Examples: Run python -m turtledemo in your terminal to see built-in demos
  • Community: Stack Overflow tag python-turtle
  • Books: “Python for Kids” by Jason R. Briggs, “Hello World!” by Warren Sande

Practice Challenges

  1. Draw a rainbow using concentric arcs.
  2. Create a Pong game with two turtles.
  3. Generate a Sierpinski triangle using recursion.
  4. Build a turtle that follows your mouse pointer.
  5. Write a program that graphs mathematical functions (sine, cosine, parabola).

Final Code Snippet – A Minimal Complete Program:

import turtle

t = turtle.Turtle()
t.speed(3)
for _ in range(4):
    t.forward(100)
    t.left(90)

turtle.done()

Save this, run it, and you’ve completed your first Turtle graphics program. From here, the only limit is your imagination.

Scroll to Top