使用Python的Turtle库绘制紫色小熊

引言

Turtle库是Python标准库中一个非常有趣且实用的模块,它主要用于绘制图形和动画。Turtle图形学源于Logo语言,是一种基于命令的绘图方式。通过控制一个名为“海龟”的虚拟角色,在屏幕上移动和绘制,Turtle库可以轻松地教授基础编程概念,同时也能创造出令人惊叹的视觉艺术作品。本文将介绍如何使用Turtle库创建一个紫色小熊与风车的动态画面,包括Turtle库的基本使用,代码开发思路,以及重点代码的详细解释。

Turtle库简介

Turtle库提供了许多函数,如forward(), backward(), left(), right()等,用于控制海龟的移动方向和距离;penup(), pendown()用于控制是否在移动时绘制线条;pencolor(), fillcolor(), pensize()用于设置线条颜色、填充颜色和线条粗细。tracer()可以控制动画的刷新速度,而screensize(), setup(), title()则用于配置绘图窗口的大小、位置和标题。

开发思路

我们的目标是创建一个紫色小熊在旁边玩着风车的动画场景。首先,我们需要设定绘图区域的大小、背景颜色,以及调整绘图速度。接着,我们将定义两个主要函数:drawXiaoXiong()用于绘制小熊,fongche()用于绘制风车。最后,我们使用rotate()函数来实现风车的动态旋转效果。

代码运行效果

在这里插入图片描述

完整代码
import turtle as t
t.colormode(255)  # 颜色模式
t.speed(0)
t.screensize(850, 760, "white")  # 画布大小背景颜色
t.setup(width=850, height=760, startx=None, starty=None)  # 绘图窗口的大小和起始坐标
# 设置绘图窗口的标题
t.title("紫色小熊玩风车")
t.resizemode('noresize')
t.tracer(1)

scolor = ["#E6005C", "#00BFFF", "#538a30", "#F28500"]
qcolor = ["#FF007F", "#87CEFA", "#7fbc2b", "#FFA500"]
blsize = 80
bs = 2 ** 0.5 / 2 * blsize
zjb = blsize / 2
zjsjxxb = 2 ** 0.5 * zjb
length = 1.7 * blsize
width = 2 / 15 * blsize


def jump(x, y):
    t.penup()
    t.goto(x, y)
    t.pendown()


def rotate():
    drawXiaoXiong()
    # 画风车
    fongche()

    t.ontimer(rotate, t=100)  # 每隔100毫秒转一次
# 风车
def fongche():
    t.penup()
    t.goto(-205, -42)
    t.begin_fill()
    t.pensize(4)
    t.pencolor("#321320")
    t.fillcolor("#D2B48C")
    t.circle(15)
    t.end_fill()
    jump(-220, 80)
    t.setheading(-90)
    t.pensize(width)
    t.pencolor("#5f4a1d")
    t.forward(length)
    t.pensize(2)
    t.backward(length)
    t.setheading(90)

    for i in range(4):
        # 小等腰直角三角形
        t.color(scolor[i])
        t.begin_fill()
        t.forward(zjb)
        t.left(90)
        t.forward(zjb)
        t.left(135)
        t.forward(zjsjxxb)
        t.end_fill()
        # 大等腰直角三角形
        t.color(qcolor[i])
        t.begin_fill()
        t.backward(zjsjxxb)
        t.right(90)
        t.forward(bs)
        t.left(135)
        t.forward(blsize)
        t.end_fill()
        # 旋转180度后,画下一片风车叶片
        t.right(180)
        t.penup()


mling_circle_list = iter([  # 每段弧线(半径,弧角度数)
    (18, 360), (14, 360), (10, 360), (6, 360),
    (18, 360), (14, 360), (10, 360), (6, 360),
])


def mling_draw_eyeball(zb1, zb2, zb3, zb4):
    for zb, color_ in zip([zb1, zb2, zb3, zb4], ['#ffffff', '#482d08', '#000000', '#ffffff']):
        t.penup()
        t.goto(*zb)
        t.pendown()
        t.begin_fill()
        t.setheading(0)
        t.color(color_)
        t.pencolor('#000000')
        t.pensize(2)
        t.circle(*next(mling_circle_list))
        t.end_fill()

def drawXiaoXiong():
    t.penup()
    t.home()
    t.pencolor("#321320")
    t.fillcolor("#cb3263")
    t.pensize(4)
    t.goto(120, 110)
    t.pendown()
    t.begin_fill()
    t.goto(200, 0)
    t.left(-40)
    t.circle(-110, 105)
    t.left(75)
    t.goto(170, -110)
    t.left(-80)
    t.circle(30, 40)
    t.left(60)
    t.circle(-80, 70)
    t.left(83)
    t.circle(-35, 95)
    t.goto(60, -270)
    t.left(-80)
    t.circle(-65, 70)
    t.left(63)
    t.circle(35, 30)
    t.left(130)
    t.circle(-65, 70)
    t.goto(-120, -270)
    t.left(-110)
    t.circle(-35, 80)
    t.left(83)
    t.circle(-80, 50)
    t.left(60)
    t.circle(-80, 60)
    t.left(60)
    t.circle(30, 30)
    t.left(20)
    t.circle(80, 80)
    t.left(-105)
    t.circle(-70, 150)
    t.left(50)
    t.circle(-170, 50)
    t.goto(120, 110)
    t.end_fill()
    t.penup()
    p = t.home()
    t.pencolor("#321320")
    t.fillcolor("#ffffff")
    t.pensize(4)
    t.goto(90, 60)
    t.pendown()
    t.begin_fill()
    t.right(30)
    t.circle(-130, 360)
    t.end_fill()
    t.penup()
    p = t.home()
    t.pencolor("#321320")
    t.fillcolor("#f3d2ad")
    t.pensize(4)
    t.goto(-250, -55)
    t.seth(0)
    t.pendown()
    t.begin_fill()
    t.right(-55)
    t.circle(-45, 270)
    t.goto(-220, -75)
    t.goto(-250, -55)
    t.end_fill()

    t.penup()
    t.home()
    t.pencolor("#321320")
    t.fillcolor("#f3d2ad")
    t.pensize(4)
    t.goto(185, -90)
    t.pendown()
    t.begin_fill()
    t.right(140)
    t.circle(43, 95)
    t.goto(185, -90)
    t.end_fill()
    t.penup()
    t.seth(0)
    t.pencolor('#321320')
    t.fillcolor('#cb3263')
    t.pensize(4)
    t.begin_fill()
    t.goto(21, 0)
    t.pendown()
    t.circle(123, 134)
    t.left(-90)
    t.circle(40, 185)
    t.left(-60)
    t.circle(120, 60)
    t.left(-90)
    t.circle(50, 200)
    t.left(-90)
    t.circle(100, 100)
    t.left(-12)
    t.circle(100, 40)
    t.goto(21, 0)
    t.penup()
    t.end_fill()
    t.penup()
    t.goto(0, 0)
    t.seth(0)
    t.pencolor('#321320')
    t.fillcolor('#ffffff')
    t.pensize(4)
    t.begin_fill()
    t.goto(-70, 210)
    t.left(140)
    t.pendown()
    t.circle(30, 200)
    t.goto(-70, 210)
    t.penup()
    t.end_fill()
    t.penup()
    t.goto(0, 0)
    t.seth(0)
    t.pencolor('#321320')
    t.fillcolor('#ffffff')
    t.pensize(4)
    t.begin_fill()
    t.goto(90, 220)
    t.left(45)
    t.pendown()
    t.circle(22, 200)
    t.goto(90, 220)
    t.penup()
    t.end_fill()
    t.penup()
    t.goto(0, 0)
    t.seth(0)
    t.pencolor('#321320')
    t.fillcolor('#ffffff')
    t.pensize(4)
    t.begin_fill()
    t.left(-98)
    t.left(90)
    t.goto(18, 10)
    t.pendown()
    t.circle(100, 134)
    t.left(10)
    t.circle(110, 30)
    t.left(10)
    t.circle(160, 40)
    t.circle(85, 40)
    t.left(2)
    t.circle(95, 40)
    t.left(5)
    t.circle(95, 60)
    t.goto(18, 10)
    t.penup()
    t.end_fill()
    t.penup()
    t.home()
    t.pencolor("#321320")
    t.fillcolor("#8f3a52")
    t.pensize(2)
    t.goto(25, 240)
    t.pendown()
    t.begin_fill()
    t.goto(60, 235)
    t.left(30)
    t.fd(8)
    t.left(90)
    t.fd(22)
    t.circle(90, 8)
    t.left(20)
    t.circle(90, 8)
    t.left(20)
    t.circle(90, 20)
    t.left(40)
    t.circle(50, 20)
    t.end_fill()
    t.penup()
    t.pensize(12)
    t.goto(-2, 250)
    t.pencolor("#4D1F00")
    t.fillcolor("#4D1F00")
    t.pendown()
    t.goto(60, 240)
    t.end_fill()
    t.penup()
    t.home()
    t.pencolor("#321320")
    t.fillcolor("#8f3a52")
    t.pensize(2)
    t.goto(-55, 193)
    t.pendown()
    t.begin_fill()
    t.left(65)
    t.circle(-90, 25)
    t.goto(-10, 230)
    t.left(30)
    t.fd(8)
    t.left(90)
    t.fd(18)
    t.circle(90, 8)
    t.left(20)
    t.circle(90, 10)
    t.left(40)
    t.circle(90, 30)
    t.left(30)
    t.circle(40, 20)
    t.penup()
    t.end_fill()
    t.pensize(12)
    t.goto(-63, 195)
    t.pencolor("#4D1F00")
    t.fillcolor("#4D1F00")
    t.pendown()
    t.left(100)
    t.circle(-85, 45)
    t.end_fill()

    mling_draw_eyeball((-20, 180), (-23, 185), (-25, 188), (-30, 200))
    mling_draw_eyeball((30, 193), (27, 200), (25, 203), (20, 213))

    t.penup()
    t.home()
    t.pencolor("#321320")
    t.fillcolor("#8f3a52")
    t.pensize(3)
    t.goto(25, 105)
    t.pos()
    t.pendown()
    t.begin_fill()
    t.circle(85, 65)
    t.left(16)
    t.circle(30, 55)
    t.left(20)
    t.circle(145, 58)
    t.left(8)
    t.circle(20, 55)
    t.left(8)
    t.circle(50, 65)
    t.left(-5)
    t.circle(310, 8)
    t.end_fill()
    t.penup()
    t.goto(0, 0)
    t.seth(0)
    t.pencolor('#321320')
    t.fillcolor('#a93e54')
    t.pensize(3)
    t.begin_fill()
    t.left(-20)
    t.goto(9, 66)
    t.pendown()
    t.circle(68, 40)
    t.left(10)
    t.circle(65, 40)
    t.left(160)
    t.circle(-75, 85)
    t.left(158)
    t.circle(48, 37)
    t.goto(9, 66)
    t.penup()
    t.end_fill()
    t.color('#321320')
    t.penup()
    t.goto(260, 60)
    t.pendown()



if __name__ == "__main__":
    drawXiaoXiong()
    # 画风车
    fongche()
    t.hideturtle()
    t.done()

重点代码详细解释
  • jump(x, y)函数:用于使海龟跳转到指定的坐标位置,不留下轨迹。
  • fongche()函数:负责风车的绘制,包括中心圆点、支撑杆和四片不同颜色的叶片。
  • drawXiaoXiong()函数:包含复杂的路径绘制逻辑,用于绘制小熊的身体、耳朵、眼睛等部位。
  • rotate()函数:使用ontimer()函数实现风车的周期性旋转,创建动态效果。
总结

通过本文,我们不仅学习了如何使用Turtle库来绘制复杂图形,而且还了解了如何通过编程实现动画效果。Turtle库的使用不仅限于教学,对于那些想要探索计算机图形学和动画制作的初学者来说,它也是一个极好的起点。通过实践,我们可以发现编程不仅仅是一项技能,更是一种创造美的艺术形式。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
通过使用pythonturtle绘制图形,我得到了很多收获。 首先,使用pythonturtle绘制图形可以帮助我更好地理解和应用编程的概念。在绘制图形的过程中,我需要使用很多编程基础知识和技巧,例如变量、循环、条件判断等等。通过实践绘制图形,我可以更深入地理解这些概念,并且能够将它们应用到其他编程任务中。 其次,使用pythonturtle可以培养我的创造力和想象力。在绘制图形的过程中,我可以自由发挥,设计出各种有趣的形状和图案。这让我感受到编程的乐趣,并且可以通过图形来表达自己的想法和创意。 此外,使用pythonturtle还可以提高我的问题解决能力。在绘制图形的过程中,我会遇到各种各样的问题,例如如何控制海龟的移动、如何调整图形的形状等等。通过不断尝试和调试,我能够找到解决问题的方法,并且学会了如何通过编程来解决实际问题。 最后,使用pythonturtle绘制图形还可以提升我的耐心和坚持能力。有时候绘制复杂的图形需要花费很长时间,但是我需要持续进行尝试和调整,直到达到预期的效果。这让我学会了面对困难时的耐心和坚持,同时也增加了我的毅力。 总之,通过使用pythonturtle绘制图形,我不仅学到了有关编程的知识和技巧,还培养了创造力、问题解决能力、耐心和坚持能力。这些收获对于我以后的学习和工作都非常有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱写代码的小朋友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值