跳到主要内容
Python 使用 Turtle 库绘制十种图形示例 | 极客日志
Python 算法
Python 使用 Turtle 库绘制十种图形示例 综述由AI生成 该文章展示了 Python Turtle 库的十个绘图实例,涵盖彩色螺旋线、太阳花、国旗、玫瑰花、彩色树、随机樱花树、表白树、圆舞曲、哆啦 A 梦及时钟。通过展示基础命令如移动、转向、颜色设置及循环逻辑,帮助读者理解图形编程原理并掌握相关代码实现。
王者 发布于 2025/2/7 更新于 2026/5/29 20 浏览简介
Turtle 是 Python 内置的绘图库,适合初学者学习图形编程。以下整理了十个经典案例。
1、彩色螺旋线
from turtle import *
speed(9 )
pensize(2 )
bgcolor("black" )
colors = ["red" ,"yellow" ,"purple" ,"blue" ]
for x in range (400 ):
forward(2 *x)
color(colors[x % 4 ])
left(91 )
mainloop()
2、太阳花
import turtle
turtle=turtle.Turtle()
screen=turtle.getscreen()
turtle.color('red' , 'yellow' )
turtle.begin_fill()
for i in range (50 ):
turtle.forward(200 )
turtle.left(170 )
turtle.end_fill()
turtle.done()
3、国旗 from turtle import *
screensize(2000 , 2000 , 'white' )
speed(9 )
pencolor('red' )
goto(-300 , -200 )
pd()
fillcolor('red' )
begin_fill()
for i in range (0 , 2 ):
fd(600 )
lt(90 )
fd(400 )
lt(90 )
end_fill()
pu()
pencolor('yellow' )
goto(-260 , 120 )
pd()
fillcolor('yellow' )
begin_fill()
for i in range (0 , 5 ):
fd(113.137 )
rt(144 )
end_fill()
list1 = [(-100 , 160 ), (-60 , 120 ), (-60 , 60 ), (-100 , 20 )]
list2 = [31.98 , 8.13 , -15.59 , -38.66 ]
for j in range (0 , 4 ):
seth(0 )
pu()
goto(list1[j])
lt(list2[j])
bk(20 )
lt(18 )
pd()
begin_fill()
for i in range (0 , 5 ):
fd(113.137 / 3 )
rt(144 )
end_fill()
pu()
ht()
done()
4、玫瑰花 import turtle
import time
turtle.speed(5 )
turtle.penup()
turtle.left(90 )
turtle.fd(200 )
turtle.pendown()
turtle.right(90 )
turtle.fillcolor("red" )
turtle.begin_fill()
turtle.circle(10 ,180 )
turtle.circle(25 ,110 )
turtle.left(50 )
turtle.circle(60 ,45 )
turtle.circle(20 ,170 )
turtle.right(24 )
turtle.fd(30 )
turtle.left(10 )
turtle.circle(30 ,110 )
turtle.fd(20 )
turtle.left(40 )
turtle.circle(90 ,70 )
turtle.circle(30 ,150 )
turtle.right(30 )
turtle.fd(15 )
turtle.circle(80 ,90 )
turtle.left(15 )
turtle.fd(45 )
turtle.right(165 )
turtle.fd(20 )
turtle.left(155 )
turtle.circle(150 ,80 )
turtle.left(50 )
turtle.circle(150 ,90 )
turtle.end_fill()
turtle.left(150 )
turtle.circle(-90 ,70 )
turtle.left(20 )
turtle.circle(75 ,105 )
turtle.setheading(60 )
turtle.circle(80 ,98 )
turtle.circle(-90 ,40 )
turtle.left(180 )
turtle.circle(90 ,40 )
turtle.circle(-80 ,98 )
turtle.setheading(-83 )
turtle.fd(30 )
turtle.left(90 )
turtle.fd(25 )
turtle.left(45 )
turtle.fillcolor("green" )
turtle.begin_fill()
turtle.circle(-80 ,90 )
turtle.right(90 )
turtle.circle(-80 ,90 )
turtle.end_fill()
turtle.right(135 )
turtle.fd(60 )
turtle.left(180 )
turtle.fd(85 )
turtle.left(90 )
turtle.fd(80 )
turtle.right(90 )
turtle.right(45 )
turtle.fillcolor("green" )
turtle.begin_fill()
turtle.circle(80 ,90 )
turtle.left(90 )
turtle.circle(80 ,90 )
turtle.end_fill()
turtle.left(135 )
turtle.fd(60 )
turtle.left(180 )
turtle.fd(60 )
turtle.right(90 )
turtle.circle(200 ,60 )
turtle.done()
5、彩色树
from turtle import *
colormode(255 )
lt(90 )
lv = 14
l = 120
s = 45
width(lv)
r = 0
g = 0
b = 0
pencolor(r, g, b)
penup()
bk(l)
pendown()
fd(l)
def draw_tree (l, level ):
global r, g, b
w = width()
width(w * 3.0 / 4.0 )
r = r + 1
g = g + 2
b = b + 3
pencolor(r % 200 , g % 200 , b % 200 )
l = 3.0 / 4.0 * l
lt(s)
fd(l)
if level < lv:
draw_tree(l, level + 1 )
bk(l)
rt(2 * s)
fd(l)
if level < lv:
draw_tree(l, level + 1 )
bk(l)
lt(s)
width(w)
speed("fastest" )
draw_tree(l, 4 )
done()
6、随机樱花树
import turtle as T
import random
import time
def Tree (branch, t ):
time.sleep(0.0005 )
if branch > 3 :
if 8 <= branch <= 12 :
if random.randint(0 , 2 ) == 0 :
t.color('snow' )
else :
t.color('lightcoral' )
t.pensize(branch / 3 )
elif branch < 8 :
if random.randint(0 , 1 ) == 0 :
t.color('snow' )
else :
t.color('lightcoral' )
t.pensize(branch / 2 )
else :
t.color('sienna' )
t.pensize(branch / 10 )
t.forward(branch)
a = 1.5 * random.random()
t.right(20 * a)
b = 1.5 * random.random()
Tree(branch - 10 * b, t)
t.left(40 * a)
Tree(branch - 10 * b, t)
t.right(20 * a)
t.up()
t.backward(branch)
t.down()
def Petal (m, t ):
for i in range (m):
a = 200 - 400 * random.random()
b = 10 - 20 * random.random()
t.up()
t.forward(b)
t.left(90 )
t.forward(a)
t.down()
t.color('lightcoral' )
t.circle(1 )
t.up()
t.backward(a)
t.right(90 )
t.backward(b)
t = T.Turtle()
w = T.Screen()
t.hideturtle()
t.getscreen().tracer(5 , 0 )
w.screensize(bg='wheat' )
t.left(90 )
t.up()
t.backward(150 )
t.down()
t.color('sienna' )
Tree(60 , t)
Petal(200 , t)
w.exitonclick()
T.done()
7、表白树 import random
import turtle
def love (x, y ):
lv = turtle.Turtle()
lv.hideturtle()
lv.up()
lv.goto(x, y)
def curvemove ():
for i in range (20 ):
lv.right(10 )
lv.forward(2 )
lv.color('red' , 'pink' )
lv.speed(0 )
lv.pensize(1 )
lv.down()
lv.begin_fill()
lv.left(140 )
lv.forward(22 )
curvemove()
lv.left(120 )
curvemove()
lv.forward(22 )
lv.write("{}" .format ("他 - 她" ), font=("Arial" , 10 , "normal" ), align="center" )
lv.left(140 )
lv.end_fill()
def tree (branchLen, t ):
if branchLen > 5 :
if branchLen < 20 :
t.color("green" )
t.pensize(random.uniform((branchLen + 5 ) / 4 - 2 , (branchLen + 6 ) / 4 + 5 ))
t.down()
t.forward(branchLen)
love(t.xcor(), t.ycor())
t.up()
t.backward(branchLen)
t.color("brown" )
return
t.pensize(random.uniform((branchLen + 5 ) / 4 - 2 , (branchLen + 6 ) / 4 + 5 ))
t.down()
t.forward(branchLen)
ang = random.uniform(15 , 45 )
t.right(ang)
tree(branchLen - random.uniform(12 , 16 ), t)
t.left(2 * ang)
tree(branchLen - random.uniform(12 , 16 ), t)
t.right(ang)
t.up()
t.backward(branchLen)
def Fonts ():
t.penup()
t.goto(-500 , -300 )
t.pencolor('black' )
t.write("余生的快乐希望与你一起!^_^" , font=('方正行黑简体' , 30 , 'normal' ))
myWin = turtle.Screen()
t = turtle.Turtle()
t.hideturtle()
t.speed(0 )
t.left(90 )
t.up()
t.backward(200 )
t.down()
t.color("brown" )
t.pensize(32 )
t.forward(60 )
tree(100 , t)
Fonts()
myWin.exitonclick()
8、圆舞曲 from turtle import *
def stop ():
global running
running = False
def main ():
global running
clearscreen()
bgcolor("gray10" )
tracer(False )
shape("triangle" )
f = 0.793402
phi = 9.064678
s = 5
c = 1
sh = Shape("compound" )
for i in range (10 ):
shapesize(s)
p =get_shapepoly()
s *= f
c *= f
tilt(-phi)
sh.addcomponent(p, (c, 0.25 , 1 -c), "black" )
register_shape("multitri" , sh)
shapesize(1 )
shape("multitri" )
pu()
setpos(0 , -200 )
dancers = []
for i in range (180 ):
fd(7 )
tilt(-4 )
lt(2 )
update()
if i % 12 == 0 :
dancers.append(clone())
home()
running = True
onkeypress(stop)
listen()
cs = 1
while running:
ta = -4
for dancer in dancers:
dancer.fd(7 )
dancer.lt(2 )
dancer.tilt(ta)
ta = -4 if ta > 0 else 2
if cs < 180 :
right(4 )
shapesize(cs)
cs *= 1.005
update()
return "DONE!"
if __name__=='__main__' :
print (main())
mainloop()
9、哆啦 A 梦 import turtle
def flyTo (x, y ):
turtle.penup()
turtle.goto(x, y)
turtle.pendown()
def drawEye ():
turtle.tracer(False )
a = 2.5
for i in range (120 ):
if 0 <= i < 30 or 60 <= i < 90 :
a -= 0.05
else :
a += 0.05
turtle.left(3 )
turtle.fd(a)
turtle.tracer(True )
def beard ():
""" 画胡子,一共六根
"""
flyTo(-37 , 135 )
turtle.seth(165 )
turtle.fd(60 )
flyTo(-37 , 125 )
turtle.seth(180 )
turtle.fd(60 )
flyTo(-37 , 115 )
turtle.seth(193 )
turtle.fd(60 )
flyTo(37 , 135 )
turtle.seth(15 )
turtle.fd(60 )
flyTo(37 , 125 )
turtle.seth(0 )
turtle.fd(60 )
flyTo(37 , 115 )
turtle.seth(-13 )
turtle.fd(60 )
def drawRedScarf ():
""" 画围巾
"""
turtle.fillcolor("red" )
turtle.begin_fill()
turtle.seth(0 )
turtle.fd(200 )
turtle.circle(-5 , 90 )
turtle.fd(10 )
turtle.circle(-5 , 90 )
turtle.fd(207 )
turtle.circle(-5 , 90 )
turtle.fd(10 )
turtle.circle(-5 , 90 )
turtle.end_fill()
def drawMouse ():
flyTo(5 , 148 )
turtle.seth(270 )
turtle.fd(100 )
turtle.seth(0 )
turtle.circle(120 , 50 )
turtle.seth(230 )
turtle.circle(-120 , 100 )
def drawRedNose ():
flyTo(-10 , 158 )
turtle.fillcolor("red" )
turtle.begin_fill()
turtle.circle(20 )
turtle.end_fill()
def drawBlackdrawEye ():
turtle.seth(0 )
flyTo(-20 , 195 )
turtle.fillcolor("#000000" )
turtle.begin_fill()
turtle.circle(13 )
turtle.end_fill()
turtle.pensize(6 )
flyTo(20 , 205 )
turtle.seth(75 )
turtle.circle(-10 , 150 )
turtle.pensize(3 )
flyTo(-17 , 200 )
turtle.seth(0 )
turtle.fillcolor("#ffffff" )
turtle.begin_fill()
turtle.circle(5 )
turtle.end_fill()
flyTo(0 , 0 )
def drawFace ():
turtle.forward(183 )
turtle.fillcolor("white" )
turtle.begin_fill()
turtle.left(45 )
turtle.circle(120 , 100 )
turtle.seth(90 )
drawEye()
turtle.seth(180 )
turtle.penup()
turtle.fd(60 )
turtle.pendown()
turtle.seth(90 )
drawEye()
turtle.penup()
turtle.seth(180 )
turtle.fd(64 )
turtle.pendown()
turtle.seth(215 )
turtle.circle(120 , 100 )
turtle.end_fill()
def drawHead ():
""" 画了一个被切掉下半部分的圆
"""
turtle.penup()
turtle.circle(150 , 40 )
turtle.pendown()
turtle.fillcolor("#00a0de" )
turtle.begin_fill()
turtle.circle(150 , 280 )
turtle.end_fill()
def drawAll ():
drawHead()
drawRedScarf()
drawFace()
drawRedNose()
drawMouse()
beard()
flyTo(0 , 0 )
turtle.seth(0 )
turtle.penup()
turtle.circle(150 , 50 )
turtle.pendown()
turtle.seth(30 )
turtle.fd(40 )
turtle.seth(70 )
turtle.circle(-30 , 270 )
turtle.fillcolor("#00a0de" )
turtle.begin_fill()
turtle.seth(230 )
turtle.fd(80 )
turtle.seth(90 )
turtle.circle(1000 , 1 )
turtle.seth(-89 )
turtle.circle(-1000 , 10 )
turtle.seth(180 )
turtle.fd(70 )
turtle.seth(90 )
turtle.circle(30 , 180 )
turtle.seth(180 )
turtle.fd(70 )
turtle.seth(100 )
turtle.circle(-1000 , 9 )
turtle.seth(-86 )
turtle.circle(1000 , 2 )
turtle.seth(230 )
turtle.fd(40 )
turtle.circle(-30 , 230 )
turtle.seth(45 )
turtle.fd(81 )
turtle.seth(0 )
turtle.fd(203 )
turtle.circle(5 , 90 )
turtle.fd(10 )
turtle.circle(5 , 90 )
turtle.fd(7 )
turtle.seth(40 )
turtle.circle(150 , 10 )
turtle.seth(30 )
turtle.fd(40 )
turtle.end_fill()
turtle.seth(70 )
turtle.fillcolor("#FFFFFF" )
turtle.begin_fill()
turtle.circle(-30 )
turtle.end_fill()
flyTo(103.74 , -182.59 )
turtle.seth(0 )
turtle.fillcolor("#FFFFFF" )
turtle.begin_fill()
turtle.fd(15 )
turtle.circle(-15 , 180 )
turtle.fd(90 )
turtle.circle(-15 , 180 )
turtle.fd(10 )
turtle.end_fill()
flyTo(-96.26 , -182.59 )
turtle.seth(180 )
turtle.fillcolor("#FFFFFF" )
turtle.begin_fill()
turtle.fd(15 )
turtle.circle(15 , 180 )
turtle.fd(90 )
turtle.circle(15 , 180 )
turtle.fd(10 )
turtle.end_fill()
flyTo(-133.97 , -91.81 )
turtle.seth(50 )
turtle.fillcolor("#FFFFFF" )
turtle.begin_fill()
turtle.circle(30 )
turtle.end_fill()
flyTo(-103.42 , 15.09 )
turtle.seth(0 )
turtle.fd(38 )
turtle.seth(230 )
turtle.begin_fill()
turtle.circle(90 , 260 )
turtle.end_fill()
flyTo(5 , -40 )
turtle.seth(0 )
turtle.fd(70 )
turtle.seth(-90 )
turtle.circle(-70 , 180 )
turtle.seth(0 )
turtle.fd(70 )
flyTo(-103.42 , 15.09 )
turtle.fd(90 )
turtle.seth(70 )
turtle.fillcolor("#ffd200" )
turtle.begin_fill()
turtle.circle(-20 )
turtle.end_fill()
turtle.seth(170 )
turtle.fillcolor("#ffd200" )
turtle.begin_fill()
turtle.circle(-2 , 180 )
turtle.seth(10 )
turtle.circle(-100 , 22 )
turtle.circle(-2 , 180 )
turtle.seth(180 - 10 )
turtle.circle(100 , 22 )
turtle.end_fill()
flyTo(-13.42 , 15.09 )
turtle.seth(250 )
turtle.circle(20 , 110 )
turtle.seth(90 )
turtle.fd(15 )
turtle.dot(10 )
flyTo(0 , -150 )
drawBlackdrawEye()
def main ():
turtle.screensize(800 , 6000 , "#F0F0F0" )
turtle.pensize(3 )
turtle.speed(9 )
drawAll()
if __name__ == "__main__" :
main()
turtle.mainloop()
10、时钟 import turtle
from datetime import *
def Skip (step ):
turtle.penup()
turtle.forward(step)
turtle.pendown()
def mkHand (name, length ):
turtle.reset()
Skip(-length * 0.1 )
turtle.begin_poly()
turtle.forward(length * 1.1 )
turtle.end_poly()
handForm = turtle.get_poly()
turtle.register_shape(name, handForm)
def Init ():
global secHand, minHand, hurHand, printer
turtle.mode("logo" )
mkHand("secHand" , 135 )
mkHand("minHand" , 125 )
mkHand("hurHand" , 90 )
secHand = turtle.Turtle()
secHand.shape("secHand" )
minHand = turtle.Turtle()
minHand.shape("minHand" )
hurHand = turtle.Turtle()
hurHand.shape("hurHand" )
for hand in secHand, minHand, hurHand:
hand.shapesize(1 , 1 , 3 )
hand.speed(0 )
printer = turtle.Turtle()
printer.hideturtle()
printer.penup()
def SetupClock (radius ):
turtle.reset()
turtle.pensize(7 )
for i in range (60 ):
Skip(radius)
if i % 5 == 0 :
turtle.forward(20 )
Skip(-radius - 20 )
Skip(radius + 20 )
if i == 0 :
turtle.write(int (12 ), align="center" , font=("Courier" , 14 , "bold" ))
elif i == 30 :
Skip(25 )
turtle.write(int (i / 5 ), align="center" , font=("Courier" , 14 , "bold" ))
Skip(-25 )
elif (i == 25 or i == 35 ):
Skip(20 )
turtle.write(int (i / 5 ), align="center" , font=("Courier" , 14 , "bold" ))
Skip(-20 )
else :
turtle.write(int (i / 5 ), align="center" , font=("Courier" , 14 , "bold" ))
Skip(-radius - 20 )
else :
turtle.dot(5 )
Skip(-radius)
turtle.right(6 )
def Week (t ):
week = ["星期一" , "星期二" , "星期三" , "星期四" , "星期五" , "星期六" , "星期日" ]
return week[t.weekday()]
def Date (t ):
y = t.year
m = t.month
d = t.day
return "%s-%d-%d" % (y, m, d)
def Tick ():
t = datetime.today()
second = t.second + t.microsecond * 0.000001
minute = t.minute + second / 60.0
hour = t.hour + minute / 60.0
secHand.setheading(6 * second)
minHand.setheading(6 * minute)
hurHand.setheading(30 * hour)
turtle.tracer(False )
printer.forward(65 )
printer.write(Week(t), align="center" , font=("Courier" , 14 , "bold" ))
printer.back(130 )
printer.write(Date(t), align="center" , font=("Courier" , 14 , "bold" ))
printer.home()
turtle.tracer(True )
turtle.ontimer(Tick, 100 )
def main ():
turtle.tracer(False )
Init()
SetupClock(160 )
turtle.tracer(True )
Tick()
turtle.done()
if __name__ == "__main__" :
main()
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online