文章目录
- 1、简介
- 2、接口说明
- 2.1 海龟动作
- 2.1.1 移动和绘制
- 2.1.2 获取海龟的状态
- 2.2 画笔控制
- 2.2.1 绘图状态
- 2.2.2 颜色控制
- 2.2.3 填充
- 2.2.4 更多绘图控制
- 2.3 TurtleScreen/Screen 方法
- 2.3.1 窗口控制
- 2.3.2 使用屏幕事件
- 2.3.3 Screen 专有方法
- 3、示例测试
- 3.1 Turtle star
- 3.2 分形树
- 3.3 打气球
- 3.4 turtledemo --- 演示脚本集
- 结语
1、简介
海龟绘图很适合用来引导孩子学习编程。 最初来自于 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于 1967 年所创造的 Logo 编程语言。

turtle 模块提供面向对象和面向过程两种形式的海龟绘图基本组件。由于它使用 tkinter 实现基本图形界面,因此需要安装了 Tk 支持的 Python 版本。
- (1)面向对象接口
主要使用“2+2”个类:
TurtleScreen/Screen 的所有方法还存在对应的函数,即作为面向过程的接口组成部分。
RawTurtle/Turtle 的所有方法也存在对应的函数,即作为面向过程的接口组成部分。 - (2)过程式接口
过程式接口提供与 Screen 和 Turtle 类的方法相对应的函数。函数名与对应的方法名相同。当 Screen 类的方法对应函数被调用时会自动创建一个 Screen 对象。当 Turtle 类的方法对应函数被调用时会自动创建一个 (匿名的) Turtle 对象。
如果屏幕上需要有多个海龟,就必须使用面向对象的接口。
2、接口说明
2.1 海龟动作
2.1.1 移动和绘制
| 命令 | 说明 |
|---|---|
| forward() 、 fd() | 前进 |
| backward() 、 bk() 、 back() | 后退 |
| right() 、 rt() | 右转 |
| left() 、 lt() | 左转 |
| goto() 、 setpos() 、 setposition() | 前往/定位 |
| setx() | 设置x坐标 |
| sety() | 设置y坐标 |
| setheading()、 seth() | 设置朝向 |
| home() | 返回原点 |
| circle() | 画圆 |
| dot() | 画点 |
| stamp() | 印章 |
| clearstamp() | 清除印章 |
| clearstamps() | 清除多个印章 |
| undo() | 撤消 |
| speed() | 速度 |
2.1.2 获取海龟的状态
| 命令 | 说明 |
|---|---|
| position() 、 pos() | 位置 |
| towards() | 目标方向 |
| xcor() | x坐标 |
| ycor() | y坐标 |
| heading() | 朝向 |
| distance() | 距离 |
2.2 画笔控制
2.2.1 绘图状态
| 命令 | 说明 |
|---|---|
| pendown() 、 pd() 、 down() | 画笔落下 |
| penup() 、 pu() 、 up() | 画笔抬起 |
| pensize() 、 width() | 画笔粗细 |
| pen() | 画笔 |
| isdown() | 画笔是否落下 |
2.2.2 颜色控制
| 命令 | 说明 |
|---|---|
| color() | 颜色 |
| pencolor() | 画笔颜色 |
| fillcolor() | 填充颜色 |
2.2.3 填充
| 命令 | 说明 |
|---|---|
| filling() | 是否填充 |
| begin_fill() | 开始填充 |
| end_fill() | 结束填充 |
2.2.4 更多绘图控制
| 命令 | 说明 |
|---|---|
| reset() | 重置 |
| clear() | 清空 |
| write() | 书写 |
2.3 TurtleScreen/Screen 方法
2.3.1 窗口控制
| 命令 | 说明 |
|---|---|
| bgcolor() | 背景颜色 |
| bgpic() | 背景图片 |
| clearscreen() | 清空 |
| resetscreen() | 重置 |
| screensize() | 屏幕大小 |
| setworldcoordinates() | 设置世界坐标系 |
2.3.2 使用屏幕事件
| 命令 | 说明 |
|---|---|
| listen() 监听 | |
| onkey() 、onkeyrelease() | 当键盘按下并释放 |
| onkeypress() | 当键盘按下 |
| onclick() 、 onscreenclick() | 当点击屏幕 |
| ontimer() | 当达到定时 |
| mainloop() 、 done() | 主循环 |
2.3.3 Screen 专有方法
| 命令 | 说明 |
|---|---|
| bye() | 退出 |
| exitonclick() | 当点击时退出 |
| setup() | 设置 |
| title() | 标题 |
3、示例测试
3.1 Turtle star
from turtle import *
title('turtle绘图 - 爱看书的小沐')
color('red', 'yellow')
speed(10)
begin_fill()
while True:
forward(200)
left(170)
if abs(pos()) < 1:
break
end_fill()
done()
或
import turtle as t
# import time
t.color("red", "yellow")
t.speed(10)
t.begin_fill()
for _ in range(50):
t.forward(200)
t.left(170)
t.end_fill()
# time.sleep(1)
t.done()

3.2 分形树
# -*- coding: utf-8 -*-
import turtle
toplevel = 8 # 一共递归8层
angle = 30
rangle = 15
def drawTree(length, level):
turtle.left(angle) # 绘制左枝
turtle.color("black")
turtle.forward(length)
if level == toplevel: # 叶子
turtle.color("pink")
turtle.circle(2, 360)
if level < toplevel: # 在左枝退回去之前递归
drawTree(length - 10, level + 1)
turtle.back(length)
turtle.right(angle + rangle) # 绘制右枝
turtle.color("black")
turtle.forward(length)
if level == toplevel: # 叶子
turtle.color("pink")
turtle.circle(2, 360)
if level < toplevel: # 在右枝退回去之前递归
drawTree(length - 10, level + 1)
turtle.color("black")
turtle.back(length)
turtle.left(rangle)
def writePoem():
turtle.color("blue")
turtle.penup()
turtle.goto(150, -120)
turtle.write('碧玉妆成一树高,',font=("隶书", 15))
turtle.goto(150, -140)
turtle.write('万条垂下绿丝绦。',font=("隶书", 15))
turtle.goto(150, -160)
turtle.write('不知细叶谁裁出,',font=("隶书", 15))
turtle.goto(150, -180)
turtle.write('二月春风似剪刀。',font=("隶书", 15))
turtle.hideturtle()
turtle.left(90)
turtle.penup()
turtle.back(300)
turtle.pendown()
turtle.forward(100)
# turtle.speed('fastest')
turtle.speed(11)
# drawTree(80, 1)
drawTree(80, 1)
writePoem()
turtle.done()

3.3 打气球
from turtle import *
from random import randrange,choice
balloons=[] #气球队列
color_option=["red","blue","green","purple","pink","yellow","orange","black"] #颜色队列
size=50 #气球大小
def line(x,y,a,b,line_width=1,color_name="black"): #默认气球线宽度为1,颜色为黑
up()
goto(x,y)
down()
color(color_name)
width(line_width)
goto(a,b)
def distance(x,y,a,b):
return ((a-x)**2+(b-y)**2)**0.5 #根据勾股定理,判断鼠标点击位置和气球坐标的距离
def tap(x,y):
for i in range(len(balloons)):
if distance(x,y,balloons[i][0],balloons[i][1])<(size/2): #判断是否点击气球队列中的其中一个
balloons.pop(i) #删除这个气球
return #返回,因为只能同时点击一个气球
def draw():
clear() #清除画布
for i in range(1,(len(balloons)+1)): #生成下标从1开始,以下-i表示画气球时倒着画,从最后一个画到最前边
line(balloons[-i][0],balloons[-i][1],balloons[-i][0],balloons[-i][1]-size*1.5,1)
up() #把小乌龟从画布上拿下来,悬在空中
goto(balloons[-i][0],balloons[-i][1]) #去气球坐标这个位置
dot(size,balloons[-i][2]) #画原点,参数为大小和颜色
balloons[-i][1]=balloons[-i][1]+1 #改变纵坐标,模仿气球上升
update() #修改画布
def gameLoop():
if randrange(0,50)==1: #1/50的概率生成一个气球
x=randrange(-200+size,200-size) #气球坐标,在边框位置减去气球大小
c=choice(color_option) #随机在颜色队列选择一个颜色
balloons.append([x,-200-size,c]) #添加气球队列
draw()
ontimer(gameLoop,10) #每20毫秒循环一次
if __name__ == "__main__":
setup(600, 350, 0, 0) #画布大小为420*420,一开始坐标为(0,0)
bgpic(r'C:\Users\tomcat\desktop\20220919041856.png')
hideturtle() #隐藏小乌龟
tracer(False) #隐藏绘制过程
listen()
onscreenclick(tap) #如果单机,调用tap方法
gameLoop()
done() #结束函数,画布停留

3.4 turtledemo — 演示脚本集
turtledemo 包汇集了一组演示脚本。这些脚本可以通过以下命令打开所提供的演示查看器运行和查看:
python -m turtledemo
# or
python -m turtledemo.bytedesign

结语
如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!
![[starrocks BE] 启动报错问题记录](https://img-blog.csdnimg.cn/9dde11cd9ce8411cb4f2632c41b1fecd.png)


















