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
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)
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 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
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
begin_fill with an outline on the left, dot() on the right.| Want | Use |
|---|---|
| An outline only | pen.circle(r) |
| Outline and fill | begin_fill(), circle(r), end_fill() |
| A solid disc, no outline | pen.dot(diameter, colour) |
| An arc | pen.circle(r, extent) |
| A polygon | pen.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
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:
- Python turtle background
- Hide the turtle
- Area of a rectangle in Python
- Round numbers to 2 decimal places
- List comprehension with if else
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.
Bijay Kumar is a 13-time Microsoft MVP with more than 18 years in software development, and the founder of Python Guides and TSinfo Technologies. He started out building .NET and SharePoint solutions at HP, TCS and KPIT before moving into Python, machine learning and AI, and he also builds web apps with TypeScript and React. He writes the tutorials here himself, and every example is run before publishing so you see the real output. More about Bijay · Microsoft MVP profile · LinkedIn