【小沐学Python】Python实现turtle绘画

news2024/12/24 8:11:17

文章目录

  • 1、简介
  • 2、接口说明
    • 2.1 海龟动作
      • 2.1.1 移动和绘制
      • 2.1.2 获取海龟的状态
    • 2.2 画笔控制
      • 2.2.1 绘图状态
      • 2.2.2 颜色控制
      • 2.2.3 填充
      • 2.2.4 更多绘图控制
    • 2.3 TurtleScreen/Screen 方法
      • 2.3.1 窗口控制
      • 2.3.2 使用屏幕事件
      • 2.3.3 Screen 专有方法
  • 3、示例测试
    • 3.1 Turtle star
    • 3.2 分形树
    • 3.3 打气球
    • 3.4 turtledemo --- 演示脚本集
  • 结语

1、简介

海龟绘图很适合用来引导孩子学习编程。 最初来自于 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于 1967 年所创造的 Logo 编程语言。

在这里插入图片描述

turtle 模块提供面向对象和面向过程两种形式的海龟绘图基本组件。由于它使用 tkinter 实现基本图形界面,因此需要安装了 Tk 支持的 Python 版本。

  • (1)面向对象接口
    主要使用“2+2”个类:
    TurtleScreen/Screen 的所有方法还存在对应的函数,即作为面向过程的接口组成部分。
    RawTurtle/Turtle 的所有方法也存在对应的函数,即作为面向过程的接口组成部分。
  • (2)过程式接口
    过程式接口提供与 Screen 和 Turtle 类的方法相对应的函数。函数名与对应的方法名相同。当 Screen 类的方法对应函数被调用时会自动创建一个 Screen 对象。当 Turtle 类的方法对应函数被调用时会自动创建一个 (匿名的) Turtle 对象。

如果屏幕上需要有多个海龟,就必须使用面向对象的接口。

2、接口说明

2.1 海龟动作

2.1.1 移动和绘制

命令说明
forward() 、 fd()前进
backward() 、 bk() 、 back()后退
right() 、 rt()右转
left() 、 lt()左转
goto() 、 setpos() 、 setposition()前往/定位
setx()设置x坐标
sety()设置y坐标
setheading()、 seth()设置朝向
home()返回原点
circle()画圆
dot()画点
stamp()印章
clearstamp()清除印章
clearstamps()清除多个印章
undo()撤消
speed()速度

2.1.2 获取海龟的状态

命令说明
position() 、 pos()位置
towards()目标方向
xcor()x坐标
ycor()y坐标
heading()朝向
distance()距离

2.2 画笔控制

2.2.1 绘图状态

命令说明
pendown() 、 pd() 、 down()画笔落下
penup() 、 pu() 、 up()画笔抬起
pensize() 、 width()画笔粗细
pen()画笔
isdown()画笔是否落下

2.2.2 颜色控制

命令说明
color()颜色
pencolor()画笔颜色
fillcolor()填充颜色

2.2.3 填充

命令说明
filling()是否填充
begin_fill()开始填充
end_fill()结束填充

2.2.4 更多绘图控制

命令说明
reset()重置
clear()清空
write()书写

2.3 TurtleScreen/Screen 方法

2.3.1 窗口控制

命令说明
bgcolor()背景颜色
bgpic()背景图片
clearscreen()清空
resetscreen()重置
screensize()屏幕大小
setworldcoordinates()设置世界坐标系

2.3.2 使用屏幕事件

命令说明
listen() 监听
onkey() 、onkeyrelease()当键盘按下并释放
onkeypress()当键盘按下
onclick() 、 onscreenclick()当点击屏幕
ontimer()当达到定时
mainloop() 、 done()主循环

2.3.3 Screen 专有方法

命令说明
bye()退出
exitonclick()当点击时退出
setup()设置
title()标题

3、示例测试

3.1 Turtle star

from turtle import *
title('turtle绘图 - 爱看书的小沐')
color('red', 'yellow')
speed(10)
begin_fill()
while True:
    forward(200)
    left(170)
    if abs(pos()) < 1:
        break
end_fill()
done()

import turtle as t
# import time
t.color("red", "yellow")
t.speed(10)
t.begin_fill()
for _ in range(50):
    t.forward(200)
    t.left(170)
t.end_fill()
# time.sleep(1)
t.done()

在这里插入图片描述

3.2 分形树

# -*- coding: utf-8 -*-

import turtle

toplevel = 8  # 一共递归8层
angle = 30
rangle = 15


def drawTree(length, level):
    turtle.left(angle)  # 绘制左枝
    turtle.color("black")
    turtle.forward(length)

    if level == toplevel:  # 叶子
        turtle.color("pink")
        turtle.circle(2, 360)

    if level < toplevel:  # 在左枝退回去之前递归
        drawTree(length - 10, level + 1)
    turtle.back(length)

    turtle.right(angle + rangle)  # 绘制右枝
    turtle.color("black")
    turtle.forward(length)

    if level == toplevel:  # 叶子
        turtle.color("pink")
        turtle.circle(2, 360)

    if level < toplevel:  # 在右枝退回去之前递归
        drawTree(length - 10, level + 1)
        turtle.color("black")
    turtle.back(length)
    turtle.left(rangle)

def writePoem():
    turtle.color("blue")
    turtle.penup()
    turtle.goto(150, -120)
    turtle.write('碧玉妆成一树高,',font=("隶书", 15))
    turtle.goto(150, -140)
    turtle.write('万条垂下绿丝绦。',font=("隶书", 15))
    turtle.goto(150, -160)
    turtle.write('不知细叶谁裁出,',font=("隶书", 15))
    turtle.goto(150, -180)
    turtle.write('二月春风似剪刀。',font=("隶书", 15))
    turtle.hideturtle()

turtle.left(90)
turtle.penup()
turtle.back(300)
turtle.pendown()
turtle.forward(100)
# turtle.speed('fastest')
turtle.speed(11)
# drawTree(80, 1)
drawTree(80, 1)
writePoem()

turtle.done()

在这里插入图片描述

3.3 打气球


from turtle import *
from random import randrange,choice
 
balloons=[]   #气球队列
color_option=["red","blue","green","purple","pink","yellow","orange","black"]   #颜色队列
size=50   #气球大小

def line(x,y,a,b,line_width=1,color_name="black"):   #默认气球线宽度为1,颜色为黑
    up()
    goto(x,y)
    down()
    color(color_name)
    width(line_width)
    goto(a,b)

def distance(x,y,a,b):
    return ((a-x)**2+(b-y)**2)**0.5   #根据勾股定理,判断鼠标点击位置和气球坐标的距离

def tap(x,y):
    for i in range(len(balloons)):
        if distance(x,y,balloons[i][0],balloons[i][1])<(size/2):   #判断是否点击气球队列中的其中一个
            balloons.pop(i)   #删除这个气球
            return   #返回,因为只能同时点击一个气球

def draw():
    clear()   #清除画布
    for i in range(1,(len(balloons)+1)):   #生成下标从1开始,以下-i表示画气球时倒着画,从最后一个画到最前边
        line(balloons[-i][0],balloons[-i][1],balloons[-i][0],balloons[-i][1]-size*1.5,1)
        up()   #把小乌龟从画布上拿下来,悬在空中
        goto(balloons[-i][0],balloons[-i][1])   #去气球坐标这个位置
        dot(size,balloons[-i][2])   #画原点,参数为大小和颜色
        balloons[-i][1]=balloons[-i][1]+1   #改变纵坐标,模仿气球上升
    update()   #修改画布
def gameLoop():
    if randrange(0,50)==1:   #1/50的概率生成一个气球
        x=randrange(-200+size,200-size)   #气球坐标,在边框位置减去气球大小
        c=choice(color_option)   #随机在颜色队列选择一个颜色
        balloons.append([x,-200-size,c])   #添加气球队列
    draw()
    ontimer(gameLoop,10)   #每20毫秒循环一次

if __name__ == "__main__":
    setup(600, 350, 0, 0)   #画布大小为420*420,一开始坐标为(0,0)
    bgpic(r'C:\Users\tomcat\desktop\20220919041856.png')
    hideturtle()   #隐藏小乌龟
    tracer(False)   #隐藏绘制过程
    listen()
    onscreenclick(tap)   #如果单机,调用tap方法
    gameLoop()
    done()   #结束函数,画布停留

在这里插入图片描述

3.4 turtledemo — 演示脚本集

turtledemo 包汇集了一组演示脚本。这些脚本可以通过以下命令打开所提供的演示查看器运行和查看:

python -m turtledemo
# or
python -m turtledemo.bytedesign

在这里插入图片描述

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

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

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

相关文章

关于proxy的较深入研究

关于proxy的较深入研究 proxy是什么控制台打印proxy&#xff0c;展示一下vue3中的prxoy和es6的proxy有何不同&#xff1f;proxy对js和vue3来说有什么含义&#xff1f;proxy的封装机制 proxy是什么 Proxy是ES6中新增的一个对象&#xff0c;它可以用来代理另一个对象&#xff0c…

微服务eureka和nacos

服务远程调用 /*** 创建RestTemplate并注入Spring容器* return*/Beanpublic RestTemplate restTemplate(){return new RestTemplate();} Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单Order order orderMapper.fin…

关于调试别人的bug中发现的细节问题1:Switch...case...分支,永远只选择第一个分支

1、Switch…case…分支&#xff0c;永远只选择第一个分支&#xff1a; 原因&#xff1a;switch()里面的不是传入的变量&#xff0c;m_curWindowType是个成员变量&#xff0c;一直是初始值。他喵的&#xff0c;不知道谁写的下面的代码&#xff0c;大晚上的我也没有细看&#xff…

13.3寸_Wifi标签功耗电流计算-单面屏幕-1.8V的Flash测试

13.3寸Wifi标签不工作的时候电流的消耗主要来自两部分&#xff1a; 待机时&#xff0c;醒来监听时。经过测量&#xff0c;13.3寸Wifi标签的待机电流是7.13uA , 醒来监听的峰值电流是51.6 mA。13.3寸Wifi标签系统设定每间隔1秒醒来一次监听是否有唤醒数据。充电锂电池电池的容量…

00后跳槽到我们公司拿了25K,“躺平”两个字骗了我好久···

都说00后已经躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。前段时间我们部门就来了个00后&#xff0c;工作都还没两年&#xff0c;跳到我们公司起薪25K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。最近和他…

【配置环境】Windows下C/C++第三方库管理工具vcpkg安装和使用

一&#xff0c;vcpkg简介 vcpkg是微软公司开发的一个开源C包管理工具&#xff0c;它可以很方便的帮助您在 Windows、 Linux 和 MacOS 上下载&#xff0c;编译和安装C 第三方库。它具有自动解决依赖关系的能力&#xff0c;并且支持多种目标架构和平台。提供了超过1500个C库的预…

架构师基础篇之如何画架构图C4模型

1. 前言 本文将给大家介绍一种简洁明了软件架构可视化模型——C4模型&#xff0c;并手把手教大家如何使用代码绘制出精美的C4架构图。 阅读本文之后&#xff0c;读者画的架构图将会是这样的&#xff1a; 注&#xff1a;该图例仅作绘图示例使用&#xff0c;不确保其完整性、可…

❤ 关于以太网没有有效的ip配置问题解决方法

❤ 关于以太网没有有效的ip配置问题解决方法 错误提示 解决方法 一&#xff0c;检查IP地址是否为自动获取 1&#xff0c;首先右键任务栏右下角的网络图标点击进入"网络和共享中心",然后点击"更改适配器设置"。 2&#xff0c;在适配器界面右键"本…

异常数据检测 | Python实现孤立森林(IsolationForest)异常数据检测

文章目录 文章概述模型描述源码分享学习小结文章概述 异常数据检测 | Python实现孤立森林(IsolationForest)异常数据检测 模型描述 IsolationFores算法它是一种集成算法(类似于随机森林)主要用于挖掘异常(Anomaly)数据,或者说离群点挖掘,总之是在一大堆数据中,找出与其它数据…

***杨辉三角_yyds_LeetCode_python***

1.题目描述&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows …

第3章“程序的机器级表示”:异类的数据结构

文章目录 概述3.9.1 结构3.9.2 联合 概述 C提供了两种将不同类型的对象结合到一起来创建数据类型的机制&#xff1a;结构&#xff08;structure&#xff09;&#xff0c;用关键字 struct 来声明&#xff0c;将多个对象集合到一个单位中&#xff1b;联合&#xff08;union&…

Java网络开发(Asynchronous)—— 从 Jsp 到 Ajax 的 axios 到 vue 同步请求 到 异步请求

目录 引出如果想做bilibili边看视频边评论怎么搞&#xff1f;Ajax是啥&#xff1f;& axios的语法1. Ajax&#xff08;Asynchronous JavaScript And XML&#xff09;简介2. axios语法 及其与 java后端交互&#xff08;1&#xff09;get请求&#xff08;2&#xff09;post请求…

SpringBoot之Spring Data JPA入门学习

JPA&#xff08;Java Persistence API&#xff09;Java持久化API&#xff0c;是 Java 持久化的标准规范&#xff0c;Hibernate是持久化规范的技术实现&#xff0c;而Spring Data JPA是在 Hibernate 基础上封装的一款框架。 一、添加依赖 <dependency><groupId>or…

【git指南--命令大全】

我看好多文章命令都记录得比较发散不够全面&#xff0c;这里还是把我自己的笔记分享出来&#xff0c;方便查阅。 文章目录 1. git config作用域--list 显示当前所有配置配置cd ~/.ssh 2. 初始化 git 仓库1、把已有项目代码纳入 git 管理2、新建的项目直接用git 管理3、克隆仓库…

智能指针 smart_ptr

智能指针 为什么需要智能指针&#xff1f;内存泄漏什么是内存泄漏&#xff0c;内存泄漏的危害内存泄漏分类 智能指针的使用及原理RAII智能指针的原理std::auto_ptrstd::unique_ptrstd::shared_ptr 为什么需要智能指针&#xff1f; 下面我们先分析一下下面这段程序有没有什么内…

ps打开出现dll文件丢失怎么办,dll修复的三个方法

在Windows中&#xff0c;动态链接库&#xff08;DLL&#xff09;是一种可重用的代码和数据结构&#xff0c;它由多个应用程序共享&#xff0c;以提高内存利用率并减少冗余。DLL文件通常包含操作系统函数、图形驱动程序、网络驱动程序等&#xff0c;它们在Windows启动时被加载到…

大话Stable-Diffusion-Webui-客制化主题(四)

文章目录 目标效果开始重要说明单选框以及复选框图标样式更改gradio主题构建器上传主题方式代码上传主题方式目标 在DIY的主题中更改gradio单选框组件以及复选框组件的勾选后图标样式 效果 开始 笔者在使用gradio的主题构建器的过程中发现,gradio的复选框以及单选框组件勾选…

高通 Camera HAL3:如何在CAMX中查找Android TAG

之前的博文&#xff1a;《高通 Camera HAL3&#xff1a;添加一个VendorTag》中提到过&#xff0c;MetadataTag在CamX中有两种体现&#xff0c;可以是预定义的AndroidTag或是自定义VendorTag。 自定义VendorTag博文中已经讲解了 如何在CAMX中查找AndroidTag是经常要做的事 下…

【2】Midjourney注册

随着AI技术的问世&#xff0c;2023年可以说是AI爆炸性成长的一年&#xff0c;近期最广为人知的AI服务除了chatgpt外&#xff0c;就是从去年五月就已经问世的AI绘画工具mid journey了。 ▲几个AI工具也代表了人工智能的热门阶段 只要输入一段文字&#xff0c;AI就会根据语意计算…

Android 逆向之安全防护基本策略

对抗反编译 混淆 使用混淆主要可以减小包的大小。混淆对于安全保护来说&#xff0c;只是增加了阅读难度而已。混淆不会把关键代码混淆掉&#xff0c;比如MainActivity&#xff0c;Application等&#xff0c;可以通过分析smali和阅读jar包定位代码。 资源混淆也是换汤不换药&…