【小沐学Python】Python实现绘画(海龟turtle)

news2024/11/23 20:53:29

文章目录

  • 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/630894.html

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

相关文章

[starrocks BE] 启动报错问题记录

文章目录 一、一句话描述二、问题表象1. starrocks_be的启动现象&#xff1a;2. starrocks_fe的启动现象 一、一句话描述 starrocks部署在没有AVX2指令集的机器上导致部署失败&#xff0c;解决方式更换支持AVX2指令集的机器。 官方说明&#xff1a; 二、问题表象 starrocks所…

Rocket面试(五)Rocketmq发生流量控制的情况有哪些?

在使用rocketmq过程中总能看见一下异常 [TIMEOUT_CLEAN_QUEUE]broker busy, start flow control for a while, period in queue: 206ms, size of queue: 5这是因为Rocketmq出发了流量控制。 触发流量控制就是为了防止Broker压力过大挂掉。主要分为Broker流控&#xff0c;Consu…

全志V3S嵌入式驱动开发(开发环境再升级)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们陆陆续续开发了差不多有10个驱动&#xff0c;涉及到网口、串口、音频和视频等几个方面。但是整个开发的效率还是比较低的。每次开发调试的…

【MySQL 数据库】8、视图

目录 一、什么是视图二、视图语法三、检查选项(1) cascaded&#xff08;级联&#xff09;(2) local 四、视图的作用五、视图案例 一、什么是视图 视图&#xff08;View&#xff09;是一种虚拟存在的表视图中的数据并不在数据库中真实存在行和列数据来自定义视图的查询中使用的…

一棵有点自律的树——搜索二叉树

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f337;搜索二叉树概念&#x1f337;二叉搜索树的构建&#x1f33a;查找操作&#x1f33a;插入操作&#x1f33a;删除操作&#x1f33a;遍历操作☘️测试 &#x1f3f5;️拓展——递归实现&#x1f343;递归查找&…

数据结构与算法·第9章【查找】

概念 关键字&#xff1a; 是数据元素&#xff08;或记录&#xff09;中某个数据项的值&#xff0c;用以标识&#xff08;识别&#xff09;一个数据元素&#xff08;或记录&#xff09;。若此关键字可以识别唯一的一个记录&#xff0c;则称之谓“主关键字”。若此关键字能识别…

2.3 利用MyBatis实现关联查询

一、创建数据库表 1、创建教师表 执行SQL语句&#xff0c;创建教师表t_teacher CREATE TABLE t_teacher ( t_id int(11) NOT NULL AUTO_INCREMENT, t_name varchar(20) DEFAULT NULL, PRIMARY KEY (t_id) ) ENGINEInnoDB AUTO_INCREMENT4 DEFAULT CHARSETutf8mb4;执行SQL语句…

使用OpenFlow和Ryu控制器实现网络交换机的软件定义网络(SDN)控制

使用OpenFlow和Ryu控制器实现网络交换机的软件定义网络&#xff08;SDN&#xff09;控制 &#xff08;1&#xff09;环境介绍 硬件环境&#xff1a;系统最低要求为2个CPU 、2 GB内存。 拓扑介绍&#xff1a;云平台具体安装拓扑如图5-4所示。 图5-4 云平台安装拓扑 搭建云平…

使用pipreqs生成requirements文件,并在服务器(矩池云)上通过requirements文件安装环境采坑记录

目录 问题描述问题1&#xff1a;问题2&#xff1a;发现问题问题解决 问题3&#xff1a;问题4&#xff1a;问题5&#xff1a;解决方案 关键&#xff01;&#xff01;&#xff01;正常安装成功的操作流程备注1.我为何不在vscode的终端中装pipreqs包&#xff1f;2.在vscode终端中输…

Spring Cloud构建微服务架构:服务注册与发现

Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具&#xff0c;它为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。 Spring Cloud包…

面了一个来华为要22K的人,啥都不会,还不如找个应届生来代替···

最近有个在华为的朋友跟我分享了他面试招人的过程&#xff0c;感觉华为还是挺难进的。面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试。 其实&#xff0c;第一轮的电话面试除…

ASEMI代理英飞凌TLE7244SL功率电子开关,TLE7244SL参数

编辑-Z TLE7244SL参数描述&#xff1a; 型号&#xff1a;TLE7244SL 数字电源电压VDD&#xff1a;3.0 V ~ 5.5 V 模拟电源电压VDDA&#xff1a;4.5 V ~ 5.5 V 每个通道在Tj150C时的最大导通状态电阻RDS(ON,max)&#xff1a;1.7 Ω 额定负载电流IL (nom)&#xff1a;290 mA…

Nginx【反向代理负载均衡动静分离】--中

Nginx【反向代理负载均衡动静分离】–中 负载均衡-配置实例 示意图 负载均衡配置-思路分析/图解 示意图 负载均衡配置规则 负载均衡就是将负载分摊到不同的服务单元&#xff0c;既保证服务的可用性&#xff0c;又保证响应足够快 linux 下有Nginx、LVS、Haproxy 等等服务可…

在Apifox中,使用后置脚本显示响应结果reponse中的base64图片

背景 在使用Apifox去请求有图片的接口时&#xff0c;我想要请求成功的同时&#xff0c;可以显示出来图片&#xff0c;这个时候就开始百度找官方文档。最终发现可以使用后置脚本显示reponse中的图片。 方案 如下图所示&#xff0c;接口请求成功后&#xff0c;返回的json结构为…

【Spring Boot 初识丨四】主应用类

上一篇讲了 Spring Boot 的启动器 本篇来讲一讲 主程序类 Main Application Class 及注解 Spring Boot 初识&#xff1a; 【Spring Boot 初识丨一】入门实战 【Spring Boot 初识丨二】maven 【Spring Boot 初识丨三】starter 主程序类 一、定义二、注解2.1 SpringBootApplicati…

秋招指南(菜狗版)-Java前/后端开发方向

期末考试结束&#xff0c;菜的人还在享受假期&#xff0c;即将进大厂的已经在学习了&#xff08;狗头&#xff09; 作为经受去年秋招摧残的老学姐&#xff0c;给大家带来一些秋招学习的小经验&#xff0c;希望可以帮助大家避免一些求职路上的坑&#xff0c;能快速顺利地找到心仪…

论文笔记与实战:对比学习方法MOCO

目录 1. 什么是MOCO2. MOCO是干吗用的3. MOCO的工作原理3.1 一些概念1. 无监督与有监督的区别2. 什么是对比学习3. 动量是什么 3.2 MOCO工作原理1. 字典查找2. 如何构建一个好的字典3. 工作流程 3.3 &#xff08;伪&#xff09;代码分析 4. 其他一些问题5. MOCO v2和MOCO v35.1…

Nginx【反向代理负载均衡动静分离】--下

Nginx【反向代理负载均衡动静分离】–下 Nginx 工作机制&参数设置 master-worker 机制 示意图 图解 一个master 管理多个worker 一说master-worker 机制 ● 争抢机制示意图 图解 一个master Process 管理多个worker process, 也就是说Nginx 采用的是多进程结构, 而…

字节8年经验总结:13 条自动化测试框架设计原则(建议收藏)

1.代码规范 测试框架随着业务推进&#xff0c;必然会涉及代码的二次开发&#xff0c;所以代码编写应符合通用规范&#xff0c;代码命名符合业界标准&#xff0c;并且代码层次清晰。特别在大型项目、多人协作型项目中&#xff0c;如果代码没有良好的规范&#xff0c;那么整个框…

leetcode109. 有序链表转换二叉搜索树(java)

有序链表转换二叉平衡搜索树 leetcode109. 有序链表转换二叉搜索树题目描述 解题思路代码演示链表和二叉树专题 leetcode109. 有序链表转换二叉搜索树 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/convert-sorted-lis…