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()