Draw a Circle in Python Turtle: Arcs, Fills and Polygons

To draw a circle in Python turtle, call circle() with a radius:

import turtle

pen = turtle.Turtle()
pen.circle(100)          # a circle of radius 100
turtle.done()

The surprise is where it lands. It’s drawn above the turtle rather than around it, and the next section shows why.

Every screenshot here is a real turtle window on Python 3.12.5.

Drawing a circle in Python turtle

One call does it. The turtle walks the circumference and finishes back where it started, facing the same way, so you can chain shapes without repositioning:

import turtle

screen = turtle.Screen()
screen.setup(640, 480)

pen = turtle.Turtle()
pen.pensize(3)
pen.color("#0b6bcb")

pen.circle(100)          # radius of 100 pixels

print("position after drawing:", pen.position())
print("heading after drawing :", pen.heading())
turtle.done()

Output:

position after drawing: (-0.00,-0.00)
heading after drawing : 0.0
A Python turtle graphics window showing a blue circle drawn with a radius of 100 pixels
pen.circle(100), and the turtle ends up back at its starting point.

The position and heading printed above are unchanged after the call. That is what lets you draw one circle after another without losing your place.

Why is the turtle circle drawn above the turtle?

This is the part that confuses everyone the first time. turtle.circle() puts the centre one radius to the left of the current heading, not under the turtle.

A fresh turtle faces right, so left is up, and the circle appears above the start:

import turtle

screen = turtle.Screen()
screen.setup(640, 480)

pen = turtle.Turtle()
pen.speed(0)

# mark where the turtle starts
pen.dot(10, "red")
start = pen.position()

pen.pensize(3)
pen.color("#0b6bcb")
pen.circle(100)

# the centre is one radius to the LEFT of the heading, not under the turtle
pen.penup(); pen.goto(start[0], start[1] + 100); pen.dot(10, "green"); pen.penup()

print("start (red dot)  :", start)
print("centre (green)   :", (start[0], start[1] + 100))
turtle.done()

Output:

start (red dot)  : (0.00,0.00)
centre (green)   : (0.0, 100.0)
A Python turtle window with a red dot marking the start point and a green dot marking the circle centre one radius above it
Red is where the turtle stood. Green is the centre it drew around.

To centre a circle on a particular point, move one radius below it first. Or use pen.dot(), which really is centred on the turtle and doesn’t have this quirk.

Half circles and arcs with extent

extent is how many degrees of the circle to draw. Leave it out and you get all 360:

import turtle

screen = turtle.Screen()
screen.setup(680, 420)

pen = turtle.Turtle()
pen.speed(0); pen.pensize(3)

for x, extent, colour in ((-220, 90, "#c0392b"), (-40, 180, "#0a7d32"), (140, 270, "#8e44ad")):
    pen.penup(); pen.goto(x, -60); pen.pendown()
    pen.color(colour)
    pen.circle(70, extent=extent)        # only part of the way round

print("90 degrees  = a quarter arc")
print("180 degrees = a semicircle")
print("270 degrees = three quarters")
turtle.done()

Output:

90 degrees  = a quarter arc
180 degrees = a semicircle
270 degrees = three quarters
A Python turtle window showing a quarter arc, a semicircle and a three-quarter arc side by side
The same radius at 90, 180 and 270 degrees of extent.

A semicircle is pen.circle(70, 180). Arcs like these are how you build petals, rainbows and rounded corners, so you will use them more than full circles.

Turtle circle steps: drawing polygons

steps draws the shape as that many straight segments, which turns the same call into a polygon generator:

import turtle

screen = turtle.Screen()
screen.setup(680, 420)

pen = turtle.Turtle()
pen.speed(0); pen.pensize(3)

for x, steps, colour in ((-220, 3, "#c0392b"), (-40, 5, "#0a7d32"), (140, 8, "#0b6bcb")):
    pen.penup(); pen.goto(x, -60); pen.pendown()
    pen.color(colour)
    pen.circle(70, steps=steps)          # a polygon inscribed in the circle

print("steps=3 -> triangle")
print("steps=5 -> pentagon")
print("steps=8 -> octagon")
turtle.done()

Output:

steps=3 -> triangle
steps=5 -> pentagon
steps=8 -> octagon
A Python turtle window showing a triangle, a pentagon and an octagon drawn with the circle function and the steps argument
Three, five and eight steps around the same radius.

It’s a neat shortcut: any regular polygon is just a circle drawn with few enough steps. Push steps above about 30 and you’re back to something that looks round.

Filled circles and dots

You have two ways to get a solid circle, and they behave differently:

import turtle

screen = turtle.Screen()
screen.setup(640, 460)

pen = turtle.Turtle()
pen.speed(0); pen.pensize(2)

pen.penup(); pen.goto(-140, -60); pen.pendown()
pen.color("navy", "#ffd43b")      # outline, then fill
pen.begin_fill()
pen.circle(80)
pen.end_fill()

# a dot is the quick way to get a filled circle with no outline
pen.penup(); pen.goto(140, 20)
pen.dot(160, "#0a7d32")

print("begin_fill/end_fill gives an outlined, filled circle")
print("dot(size, colour) gives a filled disc in one call")
turtle.done()

Output:

begin_fill/end_fill gives an outlined, filled circle
dot(size, colour) gives a filled disc in one call
A Python turtle window showing a yellow filled circle with a navy outline next to a solid green dot
begin_fill with an outline on the left, dot() on the right.
WantUse
An outline onlypen.circle(r)
Outline and fillbegin_fill(), circle(r), end_fill()
A solid disc, no outlinepen.dot(diameter, colour)
An arcpen.circle(r, extent)
A polygonpen.circle(r, steps=n)

Watch the units: dot() takes a diameter while circle() takes a radius. It’s an easy way to end up with a shape twice the size you wanted.

Clockwise circles with a negative radius

A negative radius flips both the direction of travel and which side the centre sits on:

import turtle

screen = turtle.Screen()
screen.setup(640, 460)

pen = turtle.Turtle()
pen.speed(0); pen.pensize(3)

pen.penup(); pen.goto(-120, 0); pen.pendown()
pen.color("#0a7d32")
pen.circle(80)             # positive radius: anticlockwise, centre on the left

pen.penup(); pen.goto(140, 0); pen.pendown()
pen.color("#c0392b")
pen.circle(-80)            # negative radius: clockwise, centre on the right

print("positive radius -> anticlockwise, centre to the left of the heading")
print("negative radius -> clockwise, centre to the right")
turtle.done()

Output:

positive radius -> anticlockwise, centre to the left of the heading
negative radius -> clockwise, centre to the right
A Python turtle window comparing a circle drawn with a positive radius against one drawn with a negative radius
Positive on the left, negative on the right: mirror images.

That’s the tidiest way to draw symmetrical shapes without recalculating positions. For more turtle drawing, see setting the turtle background.

More Python turtle and beginner guides:

Frequently asked questions

How do you draw a circle in Python turtle?

pen.circle(radius) after creating a Turtle. The arguments are documented in the turtle.circle reference.

Why is my turtle circle drawn above the turtle?

Because the centre sits one radius to the left of the current heading. A new turtle faces right, so the circle goes up.

How do I draw a semicircle in turtle?

pen.circle(radius, 180). The second argument is the extent in degrees.

How do I fill a circle with colour?

pen.begin_fill(), draw the circle, then pen.end_fill(). Set the colours with pen.color(outline, fill).

What is the difference between circle() and dot()?

circle() takes a radius and draws around an offset centre; dot() takes a diameter and draws a filled disc centred on the turtle.

How do I draw a circle clockwise?

Pass a negative radius, such as pen.circle(-100). That mirrors both the direction and the centre.

How do I draw a polygon with turtle circle?

Use the steps argument: pen.circle(70, steps=6) draws a hexagon inscribed in that circle.