使用Python的Turtle模块绘制Hello Kitty兔子

引言

在编程的世界里,图形化编程不仅是一种乐趣,也是一种艺术。Python的Turtle模块提供了简单而强大的图形绘制功能,让初学者能够轻松地用代码创作出精美的图形和动画。本篇博客将介绍如何使用Turtle模块绘制一只可爱的Hello Kitty卡通形象,并在其中融入一颗爱心,最后附上一句温馨的问候。

Turtle模块简介

Turtle模块是Python的一个标准库,它提供了基于屏幕的2D图形绘制环境。Turtle图形是由一个虚拟的“海龟”移动路径构成的,通过控制这个“海龟”的移动、转向、抬笔、落笔等操作,可以在屏幕上绘制出各种形状和图案。

基本使用
  • import turtle as t: 导入Turtle模块。
  • t.penup(), t.pendown(): 控制画笔的抬起和落下。
  • t.goto(x, y): 移动到屏幕上的指定坐标。
  • t.setheading(angle): 设置海龟的方向。
  • t.forward(distance), t.backward(distance): 向前或向后移动指定的距离。
  • t.left(angle), t.right(angle): 左转或右转指定的角度。
  • t.fillcolor(color), t.begin_fill(), t.end_fill(): 设置填充颜色并开始/结束填充。
  • t.delay(ms): 设置绘制延迟时间,影响动画效果。
运行效果

在这里插入图片描述

代码详细解释

我们将Hello Kitty卡通形象分解为多个部分进行绘制,包括头、耳朵、眼睛、鼻子、胡须、花朵、身体、以及一颗爱心。每个部分都通过一系列的Turtle函数调用来完成。

  • 爱心:使用圆弧和直线绘制出一个爱心形状。
  • :通过动态调整方向和步长,绘制出曲线构成的头部轮廓。
  • 耳朵:使用类似的方法绘制两只耳朵,注意调整初始方向和步长变化。
  • 眼睛:使用圆弧和变化的步长绘制出椭圆形的眼睛。
  • 鼻子:采用与眼睛相似的技术,绘制出Hello Kitty的小鼻子。
  • 小花:绘制花朵时,通过循环和方向调整来形成花瓣。
  • 胡须:使用直线和轻微的角度调整来绘制胡须。
  • 身体:身体由多个曲线和直线组成,通过调整方向和步长实现。
  • 左右手和脚:同样使用曲线和直线,注意手部的细节处理。
完整代码
import math
import turtle as t
# 爱心
def heart():
    t.pensize(9)
    t.setheading(90)
    t.penup()
    t.color("deeppink")
    t.goto(-125, -135)
    t.pendown()
    t.begin_fill()
    t.fillcolor('deeppink')
    t.circle(9, 211)
    t.fd(9 * 2.4)
    t.lt(90)
    t.fd(9 * 2.4)
    t.circle(9, 211)
    t.end_fill()
# 头
def head():
    t.pensize(8)
    t.pencolor("black")
    t.penup()
    t.goto(-130, 170)
    t.pendown()
    t.setheading(220)
    for x in range(580):
        t.forward(1)
        if x < 250:
            t.left(0.5)
        elif x < 350:
            t.left(0.1)
        else:
            t.left(0.5)
# 耳朵
def ears():
    t.setheading(70)
    for i in range(150):
        t.forward(1)
        if i < 80:
            t.left(0.2)
        elif i < 90:
            t.left(10)
        else:
            t.left(0.2)
    t.setheading(160)
    for i in range(140):
        t.forward(1)
        t.left(0.15)
    t.setheading(140)
    for i in range(157):
        t.forward(1)
        if i < 65:
            t.left(0.2)
        elif i < 75:
            t.left(8)
        else:
            t.left(0.5)
# 眼睛
def eyes():
    # 左眼
    t.pensize(5)
    t.penup()
    t.goto(-100, 60)
    t.setheading(350)
    t.pendown()
    t.fillcolor("black")
    t.begin_fill()
    step = 0.3
    for i in range(2):
        for j in range(60):
            if j < 30:
                step += 0.02
            else:
                step -= 0.02
            t.forward(step)
            t.left(3)
    t.end_fill()
    # 右眼
    t.penup()
    t.goto(50, 40)
    t.setheading(350)
    t.pendown()
    t.fillcolor("black")
    t.begin_fill()
    step = 0.3
    for i in range(2):
        for j in range(60):
            if j < 30:
                step += 0.02
            else:
                step -= 0.02
            t.forward(step)
            t.left(3)
    t.end_fill()
# 鼻子
def nose():
    t.penup()
    t.goto(-40, 30)
    t.setheading(260)
    t.pendown()
    t.fillcolor("#ebc80e")
    t.begin_fill()
    step = 0.3
    for i in range(2):
        for j in range(60):
            if j < 30:
                step += 0.02
            else:
                step -= 0.02
            t.forward(step)
            t.left(3)
    t.end_fill()
# 小花
def flower(n):
    for i in range(n):
        t.forward(0.5)
        if i < 80:
            t.left(1)
        elif i < 120:
            t.left(2.3)
        else:
            t.left(1)
# 花朵
def flowers():
    t.penup()
    t.goto(20, 180)
    t.pendown()
    t.fillcolor("#dd4a76")
    t.begin_fill()
    t.setheading(175)
    flower(200)
    t.setheading(250)
    flower(200)
    t.setheading(325)
    flower(200)
    t.setheading(40)
    flower(200)
    t.setheading(115)
    flower(170)
    t.end_fill()
    t.penup()
    t.goto(30, 180)
    t.setheading(270)
    t.pendown()
    t.fillcolor("#e7be04")
    t.begin_fill()
    t.circle(10)
    t.end_fill()
# 胡须
def beard():
    t.penup()
    t.goto(-150, 65)
    t.pendown()
    t.setheading(170)
    t.pensize(6)
    for y in range(40):
        t.forward(1)
        t.left(0.3)
    t.penup()
    t.goto(-150, 85)
    t.pendown()
    t.setheading(160)
    for y in range(50):
        t.forward(1)
        t.left(0.3)
    t.penup()
    t.goto(-150, 45)
    t.pendown()
    t.setheading(180)
    for y in range(55):
        t.forward(1)
        t.left(0.3)
    t.penup()
    t.goto(110, 10)
    t.setheading(340)
    t.pendown()
    for y in range(40):
        t.forward(1)
        t.right(0.3)
    t.penup()
    t.goto(120, 30)
    t.setheading(350)
    t.pendown()
    for y in range(30):
        t.forward(1)
        t.right(0.3)
    t.penup()
    t.goto(115, 50)
    t.setheading(360)
    t.pendown()
    for y in range(50):
        t.forward(1)
        t.right(0.3)
def myarc(t, r, angle):
    length = 2 * math.pi * r * angle / 360  # angle角度的扇形的弧长
    n = int(length / 3) + 1  # 线段条数
    step_length = length / n  # 每条线段的长度
    step_angle = angle / n  # 每条线段的角度
    polyline(t, n, step_length, step_angle)
def polyline(t, n, length, angle):
    for index in range(n):
        t.fd(length)
        t.lt(angle)
# 身体
def body():
    t.pensize(8)
    t.penup()
    t.goto(-100, -30)
    t.setheading(230)
    t.pendown()
    t.fillcolor("#efa9c1")
    t.begin_fill()
    for z in range(140):
        t.forward(1)
        t.left(0.2)
    t.setheading(340)
    for z in range(200):
        t.forward(1)
        t.left(0.1)
    t.setheading(85)
    for z in range(140):
        t.forward(1)
        t.left(0.1)
    t.end_fill()
    t.penup()
    t.goto(-73, -33)
    t.pendown()
    t.setheading(250)
    t.fillcolor("#da4b76")
    t.begin_fill()
    myarc(t, 40, 205)
    t.setheading(170)
    t.pensize(6)
    t.forward(75)
    t.end_fill()
    # 左胳膊
    t.pensize(8)
    t.penup()
    t.goto(-120, -17)
    t.setheading(230)
    t.pendown()
    t.fillcolor("#d64b75")
    t.begin_fill()
    t.forward(50)
    t.setheading(320)
    for k in range(27):
        t.forward(1)
        t.left(1)
    t.setheading(55)
    for k in range(50):
        t.forward(1)
        t.right(0.1)
    t.end_fill()
    # 左手
    t.penup()
    t.goto(-125, -15)
    t.setheading(140)
    t.pendown()
    t.fillcolor("pink")
    t.begin_fill()
    t.forward(8)
    t.setheading(50)
    myarc(t, 10, 190)
    t.setheading(150)
    for j in range(80):
        t.forward(1)
        t.left(2.2)
    t.forward(24)
    t.end_fill()
    # 右胳膊
    t.penup()
    t.goto(27, -45)
    t.pendown()
    t.fillcolor("#db4e79")
    t.setheading(350)
    t.begin_fill()
    for x in range(50):
        t.forward(1)
        t.right(1)
    t.setheading(220)
    t.forward(40)
    t.setheading(100)
    for x in range(50):
        t.forward(1)
        t.left(0.2)
    t.end_fill()
    # 右手
    t.penup()
    t.goto(70, -75)
    t.pendown()
    t.setheading(300)
    t.forward(8)
    t.setheading(30)
    for x in range(40):
        t.forward(1)
        t.right(5)
    t.setheading(280)
    for x in range(70):
        t.forward(1)
        t.right(2)
    # 右脚
    t.penup()
    t.goto(-70, -180)
    t.pendown()
    t.setheading(250)
    for x in range(30):
        t.forward(1)
        t.left(0.3)
    for x in range(160):
        t.forward(1)
        if x < 30:
            t.left(3)
        elif x < 65:
            t.left(0.1)
        else:
            t.left(1)
    # 左脚
    t.penup()
    t.goto(-150, -210)
    t.setheading(340)
    t.pendown()
    t.fillcolor("pink")
    t.begin_fill()
    step = 1.5
    for i in range(2):
        for j in range(60):
            if j < 30:
                step += 0.1
            else:
                step -= 0.1
            t.forward(step)
            t.left(3)
    t.end_fill()
# 主函数
t.setup(0.8, 0.8)
t.title('hellokitty')
t.bgcolor('pink')
t.hideturtle()

t.delay(0)
head()
ears()
eyes()
nose()
beard()
flowers()
body()
heart()
t.penup()
t.goto(300, -100)
t.write('我是一只kitty猫', align='center', font=('楷体', 30, 'normal'))
t.done()
结语

通过这段代码,我们不仅学会了如何使用Turtle模块绘制复杂的图形,也体验到了编程带来的乐趣和成就感。Hello Kitty的形象不仅可爱,更蕴含着对生活的热爱和对美好的追求。希望这篇博客能够激发你的创意,鼓励你用代码表达自己的想法和情感。

posted @   燕鹏  阅读(189)  评论(0编辑  收藏  举报  
(评论功能已被禁用)
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示