首页 > 用户笔记 > 赢的笔记 阅读:2

Python Turtle绘制哆啦A梦(完整源码,非常详细)

turtle 是 Python 编程语言中一个非常有趣且易于上手的绘图库,它提供了一个小海龟(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()

相关文章