Python Turtle绘制哆啦A梦(完整源码,非常详细)
turtle 是 Python 编程语言中一个非常有趣且易于上手的绘图库,它提供了一个小海龟(turtle)的图形界面,用户可以通过编程来控制这只小海龟在屏幕上移动,并绘制出各种形状和图案。
turtle 库特别适合用于初学者的编程教育,因为它将编程逻辑与直观的图形反馈相结合,使得学习过程更加生动有趣。
这里就完整代码奉上:
turtle 库特别适合用于初学者的编程教育,因为它将编程逻辑与直观的图形反馈相结合,使得学习过程更加生动有趣。
坐标体系
什么是坐标体系?就是让我们知道小海龟身在何处,该怎么去绘制图形,就像我们人生有了方向、目标。下面介绍三种坐标体系,分别是角度坐标体系、绝对坐标体系、屏幕坐标体系。1) 角度坐标体系
顾名思义,就是调整海龟前进的方向,从 0 度到 360 度,逆时针旋转。常用方法 left、right、seth:
2) 绝对坐标系
水平的数轴叫做 x 轴或横轴,垂直的数轴叫做 y 轴或纵轴,它们的公共O称为坐标系的原点。我们可以通过 goto 方法将海龟移动指定位置。
3) 屏幕坐标体系
就是显示屏,以左上角为原点,横轴为 x,纵轴为 y,我们可以通过 setup 来设置窗口的大小、显示位置。
常用方法
1) 海龟动作方法
| 方 法 | 说 明 |
|---|---|
| forward(distance) 或 fd(distance) | distance 表示前进的距离,浮点数 |
| backward(distance) 或 bk(distance) | distance 表示后退的距离,浮点数 |
| right(angle) 或 rt(angle) | angle 表示旋转的角度,浮点数,如向右旋转 90 度,rt(90) |
| left(angle) 或 lt(angle) | angle 表示旋转的角度,浮点数,如向左旋转 90 度,lt(90) |
|
goto(_x_, _y=None_) setpos(_x_, _y=None_ setposition(_x_, _y=None_) |
移动到指定坐标位置,如 goto(5,10) |
| setx(x) | 设置海龟横坐标,纵坐标保持不变 |
| sety(y) | 设置海龟纵坐标,横坐标保持不变 |
| setheading() 或 seth() | 设置海龟朝向,以角度坐标系为标准,如朝向 90 度方向,seth(90) |
| home() | 返回初始原点(0,0) |
| circle(radius, extent, steps) | 画圆,radius 表示半径,extent 表示角度,如 steps 未指定,steps 则绘制圆弧,指定则绘制多边形(边数大于 0)。circle(20,180),表示绘制一个半径为 20 的半圆 |
| speed(speed) | 画笔移动速度,速度值从 1 到 10 |
| dot(size,color) | 画点,size 表示直径,color 表示颜色,如 dot(20,"red") 画一个直径为 20 的红点 |
2) 获取海龟状态
| 方 法 | 说 明 |
|---|---|
| position() 或 pos() | 返回海龟当前的坐标 (x,y) |
| towards(x,y) | 返回从海龟位置到由 (x,y) 的连线的夹角,如 goto(5,5) towards(0,0) 返回 225.0 |
| xcor() | 获取海龟当前位置的 x 值 |
| ycor() | 获取海龟当前位置的 y 值 |
| heading() | 获取海龟当前位置的朝向 |
| distance(x,y=None) | 返回从海龟位置到由 (x,y) 的单位距离 |
3) 画笔控制
| 方 法 | 说明 |
|---|---|
| pendown() 或 pd() | 画笔落下 |
| penup() 或 pu() 或 up() | 画笔拿起,画笔拿起来后,就不会画线 |
| pensize(width) 或 width(width) | 设置画笔粗细 |
| isdown() | 如果画笔落下返回 True,如果画笔抬起返回 False |
4) 颜色控制
| 方 法 | 说 明 |
|---|---|
| color() | 返回或设置画笔颜色和填充颜色。没有传入参数,以一组元组形式返回当前画笔颜色和填充颜色,color("red","blue"),设置画笔颜色为红色,填充颜色为蓝色 |
| pencolor() | 设置当前画笔的颜色,没有传入参数则以字符串的形式返回当前画笔的颜色。pencolor("red"),表示设置当前画笔的颜色为红色 |
| fillcolor() | 返回或设置填充颜色 |
| filling() | 返回填充状态 (填充为 True,否则为 False) |
| begin_fill() | 在绘制要填充的形状之前调用 |
| end_fill() | 填充上次调用 begin_fill() 之后绘制的形状 |
5) 海龟外观
| 方 法 | 说 明 |
|---|---|
| hideturtle() 或 ht() | 隐藏海龟 |
| showturtle() 或 st() | 显现海龟 |
| isvisible() | 如果海龟显示返回 True,如果海龟隐藏返回 False |
| shape(name=None) | 设置海龟形状,如未指定形状名则返回当前的形状名,有以下几种可设置 "arrow"、"turtle"、"circle"、"square"、"triangle"、"classic" |
| tilt(angle) | 改变海龟形状的朝向,但不改变海龟移动方向 |
| shapesize() 或 turtlesize() | 返回或设置笔的属性 x/y-stretchfactors 和 / 或轮廓。将调整大小模式设置为 “user”。当且仅当 resizemode 设置为 “user” 时, turtle 将根据其拉伸因子拉伸显示:stretch_wid 是垂直于其方向的拉伸因子,stretch_len 是其方向的拉伸因子,outline 确定宽度形状的轮廓 |
6) 鼠标事件
| 方 法 | 说 明 |
|---|---|
| onclick(_fun_, _btn=1_, _add=None_) |
鼠标点击事件 fun:一个函数,调用时将传入两个参数表示在画布上点击的坐标 btn:鼠标按钮编号,默认值为 1 (鼠标左键) add:True 或 False。如为 True 则将添加一个新绑定,否则将取代先前的绑定; 如 onclick(goto) |
| onrelease(_fun_, _btn=1_,_add=None_) |
鼠标释放事件 fun: 一个函数,调用时将传入两个参数表示在画布上点击的坐标 btn:鼠标按钮编号,默认值为 1 (鼠标左键) add:True 或 False。如为 True 则将添加一个新绑定,否则将取代先前的绑定 |
| ondrag(_fun_, _btn=1_, _add=None_) |
鼠标拖动事件 fun:一个函数,调用时将传入两个参数表示在画布上点击的坐标。 btn:鼠标按钮编号,默认值为 1 (鼠标左键 add:True 或 False。如为 True 则将添加一个新绑定,否则将取代先前的绑定 |
7) 键盘事件
| 方 法 | 说 明 |
|---|---|
| onkey(fun, key) 或 onkeyrelease(_fun_, _key_) | 当键盘按下并释放,fun 传入函数对象,key 传入键盘值,如 Right |
| onkeypress(fun,key) | 当键盘按下,如上 |
8) 窗口控制
| 方 法 | 说 明 |
|---|---|
| bocolor(color) | 设置背景颜色,未传入值则返回当前背景色,支持颜色字符串或 16 进制,如 bocolor("red") 或 bocolor("#800080") |
| bgpic(picname=None) | 设置背景图片或返回当前背景图片名称,如果 _picname_ 为一个文件名,则将相应图片设为背景。如果 _picname_ 为 "nopic",则删除当前背景图片。如果 _picname_ 为 None,则返回当前背景图片文件名。只支持 gif 图片 |
| screensize(_canvwidth=None_, _canvheight=None_, _bg=None_) | 设置画布大小,如未指定任何参数,则返回当前的画布大小,不改变绘图窗口。要观察画布的隐藏区域,可以使用滚动条 |
| bye() | 关闭窗口 |
| exitonclick() | 当鼠标点击时关闭窗口 |
| setup(width,height,startx,starty) | 设置窗口的大小和初始位置 |
| title(titlestring) | 设置窗口标题 |
9) 动画控制
| 方 法 | 说 明 |
|---|---|
| delay(_delay=None_) | 设置或返回以毫秒数表示的延迟值,绘图延迟越长,动画速度越慢 |
| tracer(_n=None_, _delay=None_) | 设置刷新图形的延迟时间。如果指定 _n_ 值,则只有每第 n 次屏幕刷新会实际执行,如果调用时不带参数,则返回当前保存的 n 值。第二个参数设置延迟值 |
| update() | 执行屏幕刷新,在禁用追踪时使用 |
10) 屏幕事件
| 方 法 | 说 明 |
|---|---|
| mainloop() 或 done() | 开始事件循环,必须作为一个海龟绘图程序的结束语句 |
| window_height() | 获取屏幕高度 |
| window_width() | 获取屏幕宽度 |
| reset() | 重置,从屏幕中删除海龟的绘图,海龟回到原点并设置所有变量为默认值 |
| clear() | 从屏幕中删除海龟的绘图。不移动海龟。海龟的状态和位置以及其他海龟的绘图不受影响 |
11) 输入方法
| 方 法 | 说 明 |
|---|---|
| write(_arg_, _move=False_, _align='left'_, _font=('Arial', 8, 'normal')_) | 将文字绘制到画布中,arg 表示文字, move 指定是否应该移动海龟以便它不会覆盖已经写入的文本,默认情况下这个参数是 False,这意味着海龟不会移动。align 文本对齐方式,font 是 Arial 字体,大小为 8,样式为正常 |
| textinput(_title_, _prompt_) | 弹出一个对话框窗口用来输入一个字符串。形参 title 为对话框窗口的标题,prompt 为一条文本,通常用来提示要输入什么信息。返回输入的字符串。如果对话框被取消则返回 None |
| numinput(_title_, _prompt_, _default=None_, _minval=None_, _maxval=None_) | 弹出一个用于输入数值的对话框窗口。 title 是对话框窗口的标题,prompt 是通常用来描述要输入的数字信息的文本。 default 是默认值, minval 是可输入的最小值,maxval 是可输入的最大值。如未给出,则将发出提示并且让话框保持打开以便修正。 返回输入的数值。 如果对话框被取消,则返回 None |
绘制哆啦A梦
这里我们将绘制一个哆啦A梦,以下是图片对比,不能说一摸一样,还是有点差距的。
'''绘制哆啦A梦'''
from turtle import *
setup(1000,1000,160,0)
width(2) # 设置画笔宽度
speed(10) # 设置笔速
# 移动画笔,在画不上不留痕迹
def move(x,y):
up()
goto(x,y)
down()
# 画铃铛
def draw_bell():
circle(-30)
move(-97,-60)
lt(90)
fd(10)
rt(83)
circle(5)
# 铃铛横线
move(-127,-30)
seth(0)
fd(58)
circle(5,extent=180)
fd(56)
circle(5,extent=180)
# 画眼睛、鼻子
# 画眼睛
def eyebrow():
move(-170+50, 175)
circle(30)
move(-110+50, 172)
circle(30)
# 鼻子
move(-140+48,157)
circle(13)
# 画眼睛里面的眼神
# 左
move(-180+50,192)
seth(63)
a = 0.3
fd(10)
for i in range(50):
a += 0.01
if i < 25:
rt(2)
fd(a)
else:
rt(3)
fd(a)
fd(10)
# 右
move(-135+50,192)
seth(63)
a = 0.3
fd(10)
for i in range(50):
a += 0.01
if i < 25:
rt(2)
fd(a)
else:
rt(3)
fd(a)
fd(10)
# 画胡子
def beard(x,y, angle, flag):
x_ = x
y_ = y
angle_ = angle
# 画椭圆
for i in range(3):
y_ -= 20
if flag:
angle_ += 15
else:
angle_ -= 15
move(x_, y_)
seth(angle_)
fd(70)
# 画脸
def face():
eyebrow()
move(-20,0)
seth(33)
circle(120,120)
move(-161,0)
seth(147)
circle(-120, 120)
# 画胡子
beard(-120, 150, 145, True) # 左
beard(-60, 150, 35, 0) # 右
# 画鼻子-竖线
move(-90,158)
seth(-90)
fd(112)
# 画嘴巴
move(-170,90)
seth(-57)
circle(100, 120)
# 画头
def draw_head():
move(20,0)
lt(50)
circle(150,260)
seth(0) # 设置朝向
# 画脸
face()
# 画手
def hand(x,y,angle,flag):
# 画手
move(x, y)
seth(angle)
if flag == "左":
circle(450, 15)
circle(30, 180)
move(-274, -115)
circle(-30, 123)
else:
circle(-450, 15)
circle(-30, 180)
move(85, -116)
circle(30, 123)
def foot(flag):
if flag == "左":
# 左弧
circle(35,130)
# 下弧
seth(-5)
circle(950,9)
else:
# 左弧
circle(-35, 130)
# 下弧
seth(-175)
circle(-950, 9)
def body():
# 画围脖
seth(0)
move(-210, 0.00)
fd(230)
circle(-8, 180)
fd(230)
circle(-8, 180)
# 画铃铛
move(-97,-1)
draw_bell()
# 画口袋
move(-22, -15)
seth(-45)
circle(-100, 270)
# 第二个口袋
move(-170, -90)
seth(0)
fd(150)
rt(90)
circle(-75, 180)
# 画左边身体
# 画身子
move(-213, -48)
seth(-100)
circle(450, 20)
hand(-211,-16,-130,"左")
# 画右边身体
move(25,-48)
seth(-80)
circle(-450,20)
hand(22,-17,-50,"右")
def main():
# 画头
draw_head()
# 画身体
body()
# 左脚
seth(-180)
move(-213, -204)
foot("左")
# 右脚
seth(0)
move(25, -204)
foot("右")
# 收尾
move(-213, -204)
seth(-5)
circle(1500,9.5)
# 底部横线
move(-97,-262)
seth(90)
fd(65)
seth(0)
fd(13)
seth(180)
fd(26)
# 隐藏海龟
ht()
# 书写文字
color("red")
move(0, -340)
write("c语言中文网--遁一",False,align="center", font=('',25,''))
if __name__ == '__main__':
main()
mainloop()
ICP备案:
公安联网备案: