使用Python的Turtle库绘制草莓熊

news2024/12/27 13:32:13
引言

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库的使用不仅限于教学,对于那些想要探索计算机图形学和动画制作的初学者来说,它也是一个极好的起点。通过实践,我们可以发现编程不仅仅是一项技能,更是一种创造美的艺术形式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1939277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA工具中Java语言写小工具遇到的问题

一:读取excel时遇到 org/apache/poi/ss/usermodel/WorkbookProvider 解决办法: 在pom.xml中把poi的引文包放在最前面即可(目前就算放在最后面也不报错了,不知道为啥) 二:本地maven打包时,没有…

React基础学习-Day08

React基础学习-Day08 React生命周期(旧)(新)(函数组件) (旧) 在 React 16 版本之前,React 使用了一套不同的生命周期方法。这些生命周期方法在 React 16 中仍然可以使用…

【人工智能】Python实现文本转换为语音:使用gTTS库实现

🔥 个人主页:空白诗 文章目录 一、引言二、准备工作三、使用gTTS实现文本转换为语音详细步骤 四、人工智能与TTS技术五、总结 一、引言 文本转换为语音(Text-to-Speech,简称TTS)技术是人工智能的重要组成部分&#xf…

2024年7月萤火虫航天为NASA发射8颗立方体卫星

作为美国宇航局立方体卫星发射计划的一部分,萤火虫航空航天公司于7月3日在该公司的阿尔法火箭上发射了八颗小型卫星。这枚名为“夏日噪音”的火箭于太平洋夏令时(PDT)晚上9点04分从加利福尼亚州范登堡空军基地的2号航天发射场成功升空。 立方…

SpringBoot整合SSE,实现后端主动推送DEMO

前言 说起服务端主动推送,大家第一个想到的一定是WEBSOCKET 。 作为软件工程师,不能无脑使用一种技术,要结合实际情况,择优选取。 SSE(Server-Sent Events)相比于WEBSOCKET 1、轻量化、兼容性 基于传统…

Mac装虚拟机占内存吗 Mac用虚拟机装Windows流畅吗

如今,越来越多的Mac用户选择在他们的设备上安装虚拟机来运行不同的操作系统。其中,最常见的是使用虚拟机在Mac上运行Windows。然而,许多人担心在Mac上装虚拟机会占用大量内存,影响电脑系统性能。此外,有些用户还关心在…

抖音火爆 百度地图导航高阶定制茉莉13个语音包附带安装教程,开车再也不会犯困了

慎用,慎用! 1、工具下载: 百度导航高阶定制茉莉13个语音包https://pan.quark.cn/s/8669c1dad02a下载 | MT管理器:https://pan.quark.cn/s/b7b8e8f16326 2、语音包路径: 百度导航路径: /storage/emulate…

【LLM】-04-提示工程 - 文本转换

目录 1、文本翻译 1.1、翻译为德语 1.2、识别语种 1.3、多语言翻译 1.4、同时进行语气转换 1.5、通用翻译器 2、语气与写作风格调整 3、数据格式转换 4、拼写及语法纠正 5、综合样例 大语言模型具有强大的文本转换能力,可以实现多语言翻译、拼写纠正、语法…

数据结构 - 栈(精简介绍)

文章目录 普通栈Stack用法Q 最长有效括号 单调栈Q 接雨水 普通栈 栈就是一个先进后出的结构 想象一个容器,往里面一层一层放东西,最早放进去的东西被压在下面(所以放元素也叫压栈),要拿到这个最低层的东西需要先把上面…

异步电机矢量控制matlab simulink

1、内容简介 略 86-可以交流、咨询、答疑 异步电机、矢量控制 2、内容说明 略 3、仿真分析 略 4、参考论文 略

[Python库](3) Arrow库

目录 1.简介 2.安装 3.函数 3.1.获取当前UTC时间( 世界协调时时间 ) 3.2.格式化日期 3.3.创建Arrow对象 3.4.时间改变 3.5.获取时间戳 3.6.时区改变 4.小结 1.简介 Arrow库是一个Python库,提供了一套用于处理日期和时间的API。Arrow库特别适合在需要进行大…

C++搜索算法(dfs)

目录 一.dfs简介 二.dfs的运用 1.迷宫问题 经典题型:最快走出迷宫 题目描述: 数据范围: 题目分析: 正确代码 2.棋盘问题: 经典题型:八皇后问题 题目描述: 题目分析: 正…

微服务实战系列之玩转Docker(五)

前言 在我们日常的工作生活中,经常听到的一句话:“是骡子是马拉出来遛遛”。目的是看一个人/物是不是名副其实。我们在使用docker时,也要看看它究竟是如何RUN起来的。当面试官问你的时候,可以如是回答,保你“一文通关…

SQUID - 形状条件下的基于分子片段的3D分子生成等变模型 评测

SQUID 是一个形状条件下基于片段的3D分子生成模型,给一个3D参考分子,SQUID 可以根据参考分子的形状,基于片段库,生成与参考分子形状非常相似的分子。 SQUID 模型来自于 ICLR 2023 文章(2022年10月6日提交)&…

中国 X86 CPU 技术源自何方

注: 原文发布于 2017 年,两篇合二为一。未与作者沟通,侵权,立删。 导语: Intel 对 X86 的授权有着极为严格的限制,那么上海兆芯的 X86 芯片技术到底从何而来?ZX-C 目前的短板在哪里?…

电子电器架构 --- 智能汽车的大脑(域控制器)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

【深入理解SpringCloud微服务】浅析微服务注册中心Eureka与nacos,手写实现一个微服务注册中心

【深入理解SpringCloud微服务】浅析微服务注册中心Eureka与nacos,手写实现一个微服务注册中心 注册中心手写实现一个注册中心服务端设计客户端设计 注册中心 注册中心是微服务体系里面非常重要的一个核心组件,它最重要的作用就是实现服务注册与发现。 …

vscode 远程 Ubuntu 系统

1、在 Ubuntu 下检查 sshd 守护进程是否开启 ps -aux | grep sshd如果没有开启,请在 Ubuntu 下输入指令安装 sudo apt-get install openssh-server2、首先打开 Windows 下的 vscode,点击左下角图标打开远程窗口 3、打开远程窗口,选择“Con…

谷粒商城实战笔记-38-前端基础-Vue-指令-单向绑定双向绑定

文章目录 一,插值表达式注意事项1:不适合复杂的逻辑处理注意事项2:插值表达式支持文本拼接注意事项3:插值表达式只能在标签体中 二,v-html和v-textv-textv-html区别总结:最佳实践 三,v-model复选…

论文阅读:Speculative RAG: Enhancing Retrieval Augmented Generation through Drafting

论文地址:https://arxiv.org/abs/2407.08223 RAG 将 LLM 的生成能力与外部知识源相结合,以提供更准确和最新的响应。最近的 RAG 进展侧重于通过迭代 LLM 完善或通过 LLM 的额外指令调整获得自我批判能力来改进检索结果。在这项工作中,作者介…