《Python趣味工具》——自制emoji3

news2024/12/23 23:50:15

今日目标
在上次,我们绘制了静态的emoji图。并且总结了turtle中的常用函数。

本次我们将尝试制作一个动态的emoji,让你的表情包动起来!


在这里插入图片描述


文章目录

  • 一、动画原理:
  • 二、制作动画:
    • 1. 修改eyes_black()函数:
    • 2. 绘制表情包文字:
    • 3. 定义emoji函数(汇合所有函数):
    • 4. 动画切换:
      • `update()`
      • `tracer(0)`
  • 三、完整源码:
  • 四、拓展讲解:
    • 1. Python模块的安装:
    • 2. turtle模块和函数的用法总结:
      • 模块的导入方法:
      • turtle的角度:

一、动画原理:

动画的原理简单来说就是一张张图片快速切换而成。

要在turtle中实现动画的效果,同样可以通过图片快速切换的方式来实现。


二、制作动画:

那怎么制作动画呢?我们通过对比观察两张图片,发现唯一的不同点是黑眼珠的位置不同。

而修改眼珠的位置,只需要修改绘制时移动的步数就可以了,然后不断的动可以看作循环打印,即循环调用绘制函数就好啦!
在这里插入图片描述
下面我们来对原来的函数进行一定的修改:

1. 修改eyes_black()函数:

我们上次已经绘制好了一侧的眼球:详见《Python趣味工具》——自制emoji2
而我们在绘制另一侧眼珠时,只需要修改移动步数——也就是将forward(6),改为forward(60)即可。(这里具体的移动大小可以自己预先算出来,包括后面的每一步都一样)

下面我们修改eyes_black()函数,为它设置一个参数x,代表移动的步数。

#  TODO 定义一个eyes_black()函数绘制黑眼珠,参数为x
def eyes_black(x):

    # 使用seth()函数将角度设置为0
    seth(0)
    
    # 使用forward()函数前进x步
    forward(x)
    
    # 使用pendown()函数落笔
    pendown()
    
    # 使用pensize()函数设置画笔粗细为15
    pensize(15)
    
    # 使用pencolor()函数设置画笔颜色为"black"
    pencolor("black")
    
    # 使用circle()函数绘制一个半径为5,圆心角为360度
    circle(5,360)
    
    # 使用penup()函数抬笔
    penup()
    
    # 使用forward()函数前进110步
    forward(110)
    
    # 使用pendown()函数落笔
    pendown()
    
    # 使用circle()函数绘制一个半径为5的圆
    circle(5,360)
    
    # 使用hideturtle()函数隐藏画笔
    hideturtle()

在这里插入图片描述


2. 绘制表情包文字:

接下来我们需要制作表情包文字。

步骤如下:

  1. 用input函数邀请用户输入自定义文字内容。
  2. 定义一个write_emoji()函数书写文字内容。
    在这里插入图片描述

具体怎么输出文字我们在《Python趣味工具》——自制emoji(1)绘制爱心应援牌❤️里已经讲过了,大家可以自行参考。

# 使用input()函数引导用户输入表情包语录
# 文案内容为"请输入表情包语录:"
content=input("请输入表情包语录:")

# 定义一个write_emoji()函数书写文字 
def write_emoji():

    # 使用penup()函数抬起画笔
    penup()
    
    # 使用fillcolor()函数将填充颜色设置为black
    fillcolor("black")
    
    # 使用goto()函数移到坐标点为(0,-170)的位置
    goto(0,-170)
    
    # 使用write()函数设置书写内容
    # 文字内容为content,居中方式为align = "center",字体类别,大小和粗细为font=("Arial",25,"bold")
    write(content,align="center",font=("Arial",25,"bold"))
    


3. 定义emoji函数(汇合所有函数):

我们已经分别定义函数绘制了emoji的每一个部分。

接下来我们可以拼接函数完成整个emoji的绘制。

在这里插入图片描述
完成绘制表情包的函数,分为3步:

1.定义函数emoji(x)绘制表情包,参数x表示黑眼珠移动距离。

2.函数包含:draw_face(),draw_mouth(),eyes_white(),eyes_black(x),write_emoji()共5个部分。

3.调用emoji(x)函数,将参数设置为60,绘制黑眼珠在右侧的表情包。

# 定义一个函数绘制emoji绘制表情,参数x表示移动位置
def emoji(x):

    # 使用draw_face()函数绘制脸部
    draw_face()
    
    # 使用draw_mouth()函数绘制嘴巴
    draw_mouth()
    
    # 使用eyes_white()函数绘制白眼珠
    eyes_white()
    
    # 使用eyes_black(x)函数绘制黑眼珠,参数x表示移动距离
    eyes_black(x)
    
    # 使用write_emoji()函数书写表情包文字
    write_emoji()
    
# 调用emoji(x)函数,将参数设置为60,绘制表情2
emoji(60)

在这里插入图片描述


4. 动画切换:

接下来我们要完成最重要的动画部分啦~

根据动画的实现原理,我们可以将两张emoji图片反复切换播放,实现动图效果,也就是:

  1. 展示emoji1
  2. 刷新屏幕
  3. 暂停一段时间(这个根据自己的实际情况看着写,不停顿效果可能会很鬼畜)
  4. 展示emoji2
# 设置一个计数器,从0开始计数   
n = 0

# 当计数小于10时
while n < 10:  

    # 使用tracer()函数,关闭动画
    tracer(0)
    
    # 绘制表情包1,emoji(6)
    emoji(6)
    
    # 使用update()函数刷新画面
    update()
    
    # 使用time.sleep()函数停顿0.5秒
    time.sleep(0.5)
    
     # 使用tracer()函数,关闭动画
    tracer(0)
    
    # 绘制表情包2,emoji(60)
    emoji(60)
    
    # 使用update()函数刷新画面
    update()
    
    # 使用time.sleep()函数停顿0.5秒
    time.sleep(0.5)
    
    # 计数器加1
    n = n + 1

第1-4行代码的作用是设置一个计数器,设置表情包的动画次数。我们将表情包的动画次数设置为10次。你在本地完成时可以修改次数,甚至一直让它动起来。

第5-12行代码的作用是绘制表情包1,并刷新画面,等待一段时间。

第13-20行代码的作用是绘制表情包2,并刷新画面,等待一段时间。

第21-22行代码的作用是计数器加1.


update()

一个函数,用于刷新画面。

在替换下一张图片前需要刷新画面,我们可以使用update()函数来实现。

在图形绘制完毕后,再使用update()函数,就可以看到当前绘制好的整个图形。


tracer(0)

一个函数,作用是控制turtle动画播放的开关。

可以用来调整绘画速度或者关闭/打开绘画过程。

比如:
我们知道,小海龟🐢走过的地方会留下它的轨迹。往前移动一点,线条就变长一点。但是如果我们想直接看到绘图结果,不想看到这样的更新过程呢?

使用tracer(0)函数,可以关闭了轨迹,即我们看不到小海龟的爬行过程。


上下两个动图分别为没有用tracer函数,和使用tracer(0)+update()函数的效果:
在这里插入图片描述


在这里插入图片描述


三、完整源码:

完结撒花~🎉🎉🎉,我们已经制作出了自己的第一个GIF动图,下面附上源代码,相信你也是跃跃欲试吧!

# 导入turtle中的全部函数
from turtle import *

# 使用input()函数引导用户输入表情包语录
# 文案内容为"请输入表情包语录 :"
content = input("请输入表情包语录 :")

# 定义draw_face()函数绘制脸部
def draw_face():

    # 抬起画笔
    penup()
    
    # 移动到坐标点为(-120,0)的地方
    goto(-120,0)
    
    # 落笔
    pendown()
    
    # 将画笔颜色设置为黑色"black"
    pencolor("black")
    
    # 将画笔粗细设置为4
    pensize(4)
    
    # 调整海龟朝向-90度方向
    seth(-90)
    
    # 开始填充颜色
    begin_fill()
    
    # 画圆,圆的半径为130,圆心角为360度
    circle(130,360)
    
    # 填充颜色为"gold"
    fillcolor("gold")
    
    # 停止填充颜色
    end_fill()
    
# 定义draw_mouth() 函数绘制嘴巴   
def draw_mouth():

    # 抬起画笔
    penup()
    
    # 移动到坐标点为(-80,-10)的位置
    goto(-80,-10)
    
    # 落笔
    pendown()
    
    # 调整海龟朝向-90度方向
    seth(-90)
    
    # 绘制一个半径为90,圆心角为180的半圆
    circle(90,180)
    
# 定义eys_white()函数绘制眼白   
def eyes_white():

    # 使用penup()函数抬起画笔
    penup()
    
    # 使用forward()函数往前直走60步
    forward(60)
    
    # 使用seth()函数将角度调整为155度
    seth(155)
    
    # 使用pendown()函数落笔
    pendown()
    
    # 使用pensize()函数设置画笔粗细为20
    pensize(20)
    
    # 使用pencolor()函数设置画笔颜色为"white"
    pencolor("white")
    
    # 使用circle()函数绘制一个半径为100,圆心角为45的弧形
    circle(100,45)
    
    # 使用penup()函数抬笔
    penup()
    
    # 使用seth()函数朝向180度方向
    seth(180)
    
    # 使用forward()函数向前走40步
    forward(40)
    
    # 使用seth()函数将角度调整为155度
    seth(155)
    
    # 使用pendown()函数落笔
    pendown()
    
    # 使用circle()函数绘制一个半径为100,圆心角为45度的圆弧
    circle(100,45)
    
    # 使用penup()函数抬笔
    penup()

#  定义一个eyes_black()函数绘制黑眼珠,参数为x
def eyes_black(x):

    # 使用seth()函数将角度设置为0
    seth(0)
    
    # 使用forward()函数前进x步
    forward(x)
    
    # 使用pendown()函数落笔
    pendown()
    
    # 使用pensize()函数设置画笔粗细为15
    pensize(15)
    
    # 使用pencolor()函数设置画笔颜色为"black"
    pencolor("black")
    
    # 使用circle()函数绘制一个半径为5,圆心角为360度
    circle(5,360)
    
    # 使用penup()函数抬笔
    penup()
    
    # 使用forward()函数前进110步
    forward(110)
    
    # 使用pendown()函数落笔
    pendown()
    
    # 使用circle()函数绘制一个半径为5的圆,圆心角为360度
    circle(5,360)
    
    # 使用hideturtle()函数隐藏画笔
    hideturtle()
    
# 定义一个write_emoji()函数书写文字 
def write_emoji():

    # 使用penup()函数抬起画笔
    penup()
    
    # 使用fillcolor()函数将填充颜色设置为black
    fillcolor("black")
    
    # 使用goto()函数移到坐标点为(0,-170)的位置
    goto(0,-170)
    
    # 使用write()函数设置书写内容
    # 文字内容为love,居中方式为align = "center",字体类别,大小和粗细为font=("Arial",25,"bold")
    write(content,align = "center",font=("Arial",25,"bold"))     

# 定义一个函数绘制emoji绘制表情,参数x表示移动位置
def emoji(x):

    # 使用draw_face()函数绘制脸部
    draw_face()
    
    # 使用draw_mouth()函数绘制嘴巴
    draw_mouth()
    
    # 使用eyes_white()函数绘制白眼珠
    eyes_white()
    
    # 使用eyes_black(x)函数绘制黑眼珠,参数x表示移动距离
    eyes_black(x)
    
    # 使用write_emoji()函数书写表情包文字
    write_emoji()
    
# 导入time函数
import time

# 设置一个计数器,从0开始计数   
n = 0

# 当计数小于10时
while n < 10:

    # 使用tracer()函数,关闭动画
    tracer(0)
    
    # 绘制表情包1,emoji(6)
    emoji(6)
    
    # 使用update()函数刷新画面
    update()
    
    # 使用time.sleep()函数设置停顿时间0.5秒
    time.sleep(0.5)
    
    # 使用tracer()函数,关闭动画
    tracer(0)
    
    # 绘制表情包2,emoji(60)
    emoji(60)
    
    # 使用update()函数刷新画面
    update()
    
    # 使用time.sleep()函数设置停顿时间0.5秒
    time.sleep(0.5)
    
    # 计数器加1
    n = n + 1
    
# 使用done()函数使得程序不会自动退出    
done()    

四、拓展讲解:

1. Python模块的安装:

在实际使用中,我们发现有的模块需要安装,但有的不需要,这是怎么回事呢?原因在于有的模块是内置的,有的是第三方提供的:

1.内置模块,是你下载了Python编辑器就自带的模块,在使用中,不需要安装,只需要导入就可以

2.第三方模块,就需要你在终端安装并且在编辑器导入了。

类比一下就是,标准模块是你手机买到就安装的App,而第三方模块就是你自己去要应用市场下载的App。
在这里插入图片描述

time,turtle是内置模块所以不需要在终端安装!


2. turtle模块和函数的用法总结:

打个比方来说,下载了某个App后我们当然要使用里面的功能

而调用函数其实就是在使用模块中的功能。


模块的导入方法:

方法1: import turtle 导入模块后,程序知道我们有了turtle这个库却不知道有哪些函数。
使用时需要用turtle.pensize()这样的方法。

方法2:from turtle import *导入所有函数时,相当于把所有函数都装进来了,就可以直接使用其中的函数了!

在这里插入图片描述
不同的模块导入的具体内容可能有些差异,但结构相似


turtle的角度:

1.相对角度
以海龟的朝向为基准进行转向。
例如:left(),right()

2.绝对角度
以坐标轴方向为基准调整角度。
例如:seth()

在这里插入图片描述


在这里插入图片描述

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

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

相关文章

构建可维护的大规模应用:框架架构的最佳实践

文章目录 框架架构的重要性最佳实践1. 模块化设计2. 遵循SOLID原则3. 使用设计模式4. 异常处理5. 代码注释和文档6. 测试 Spring Boot 和 Django&#xff1a;关键框架示例Spring Boot&#xff08;Java&#xff09;模块化设计&#xff1a;SOLID原则&#xff1a;设计模式&#xf…

分类散点图 stripplot() 加辅助线axhline() 多图合一

分类散点图 stripplot 加辅助线axhline 多图合一 效果图代码 画图没有什么可说的&#xff0c;直接上图 效果图 代码 # 绘制图&#xff0c; 查看是否数值在阈值上 plt.figure(figsize(30, 18)) n 0 for header, value_list in info_dict.items():ref_value_list ref_info_dic…

three.js——通过顶点和顶点索引创建集合体

通过顶点和顶点索引创建集合体 效果图1、创建顶点数据2、创建顶点属性3、创建材质4、创建网格5、改变网格的位置并添加到场景中6、通过顶点索引创建几何图形 效果图 1、创建顶点数据 // 创建顶点数据 每三个一个顶点 逆时针为正面 const vertices new Float32Array([ -1.0, -…

uTool快捷指令

send("************"); quickcommand.sleep(200); keyTap("enter");

关于微信小程序rich-text中图片宽度超出范围解决办法

问题描述&#xff1a;写一个富文本展示页面时发现一个问题&#xff0c;就是图片宽度超出范围&#xff0c;本能反应是给图片设置一个最大宽度&#xff0c;这里发现不可行。然后又使用正则追加样式还是不行。 // 使用正则提取html里面的图片设置图片最大宽度为100% res[1].data[0…

netty-HashedWheelTimer源码解析

一、案例分析 public void testExecutionOnTaskExecutor() throws InterruptedException {int timeout 10;final CountDownLatch latch new CountDownLatch(1);final CountDownLatch timeoutLatch new CountDownLatch(1);Executor executor new Executor() {Overridepublic…

用纯html写个个人简历!模版分享啦!!!

用纯html写个个人简历&#xff01;首先得先找个模板&#xff01; 一个优秀模板所应该具有的素质&#xff1f; 简单&#xff1f; 仅仅一个html页面&#xff0c;完全没有乱七八糟&#xff0c;保证学的明明白白。 漂亮&#xff1f; 该有的内容一个不少&#xff01; 个人照片&a…

零基础Linux_6(开发工具_下)函数库链接+Makefile+实现进度条+Git

目录 1. 函数库&#xff08;链接&#xff09; 1.1 链接 1.2 动态库与静态库 2. makefile 2.1 项目构建 2.2 Makefile的概念 2.3 Makefile的编写 2.4 .PHONY定义伪目标 ACM 时间 3.实现进度条&#xff08;缓冲区&#xff09; 3.1 缓冲区的概念 3.2 实现一个简易 &q…

全网最详细的OSPF原理总结,看这篇就够了!

大家好&#xff0c;我的网工朋友。 OSPF是一种基于链路状态的路由协议&#xff0c;也是专为 IP 开发的路由协议&#xff0c;直接运行在 IP 层上面。它从设计上保证了无路由环路。除此之外&#xff0c;IS-IS也是很常见的链路状态协议。 为什么会出现OSPF&#xff1f; 作为目前…

欧拉操作系统在线安装mysql8数据库并用navicat premium远程连接

网上太多安装教程&#xff0c;但是没有一个教程能够一站式解决安装问题&#xff0c;而我不一样&#xff0c;我写的每一个博客&#xff0c;都是我自己试验过很多次&#xff0c;能够确保一站式解决&#xff0c;才会发上去&#xff0c;希望能够帮助到大家 第一步&#xff1a;升级…

Linux工具(一)

前言&#xff1a;Linux是一个开源的操作系统&#xff0c;它拥有庞大而活跃的开发社区&#xff0c;为用户提供了丰富多样的工具和应用程序。这些工具不仅适用于系统管理员和开发人员&#xff0c;也适用于普通用户&#xff0c;可以帮助他们完成各种任务&#xff0c;从简单的文件管…

爬虫 — Scrapy 框架安装问题

整理几个关于安装 Scrapy 框架时会遇到的问题及解决方法。 1、 pip install typing-extensions4.3.0 -i https://pypi.douban.com/simple 2、 pip install pyOpenSSL22.0 -i https://pypi.douban.com/simple 3、 pip install cryptography36.0.2 -i https://pypi.douban.com/s…

基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(四)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境Pycharm 环境Scikit-learnt 模块实现1. 数据预处理2. 客流预测3. 百度地图API调用4. GUI界面设计5. 路径规划6. 智能推荐 系统测试1. 训练准确率2. 测试效果3. 程序应用 相关其它博客工程源代码下载其它资料下载 …

如何在云服务器上成功安装MongoDB数据库并用Python连接(问题及解决方法)

最近购买了1台腾讯云轻量服务器做测试&#xff0c;想在上面安装MongoDB数据库。但安装过程并不顺利&#xff0c;遇到了几个问题。本文记录一下安装过程及遇到的问题和解决方法。 一、软件下载地址&#xff1a; 1.直接打开MongoDB官网&#xff1a;https://www.mongodb.com/ …

2023 Google 开发者大会:助力传承和弘扬传统文化

文章目录 前言一、关于 Google 开发者大会1.1、什么是 Google 开发者大会&#xff1f;1.2、CSDN 上线 2023 Google 开发者大会专题页 二、敦煌深厚的艺术沉淀2.1、“云想衣裳花想容”&#xff1f;2.2、“大漠孤烟直&#xff0c;长河落日圆” 三、传统文化赋予现代艺术设计灵感四…

1.IAR-8051安装

新版安装教程&#xff1a;IAR EW for 8051 简介与安装 新版软件zhuce&#xff1a;IAR EW for 8051 软件注册 - 知乎 这个新版的我也放到网盘里面了&#xff0c;自己自行选择安装 一、下载IAR-8051 链接&#xff1a;https://pan.baidu.com/s/1mYwSQvSjAiSzltrEbK3yAw?pwd43cd …

IPV4和IPV6,公网IP和私有IP有什么区别?

文章目录 1、什么是IP地址&#xff1f;1.1、背景1.2、交换机1.3、局域网1.4、广域网1.5、ISP 互联网服务提供商 2、IPV42.1、什么是IPV4&#xff1f;2.2、IPV4的组成2.3、NAT 网络地址转换2.4、端口映射 3、公网IP和私有IP4、IPV6 1、什么是IP地址&#xff1f; 1.1、背景 一台…

接口调用三种方式

创建服务端 一个controller&#xff0c;一个启动类&#xff0c;配置端口 controller import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;RestController public class ServerController {Req…

uniapp开发h5 遇到一个刻度尺的需求 实现记录

先上最终实现图 实现这个功能使用的是github上找的一个库 叫slide-ruler 地址 实现思路&#xff1a; 第一步&#xff1a;在终端npm 下载这个依赖 第二步&#xff1a;新建一个刻度尺自定义组件&#xff0c;如果不是自定义组件会不生效&#xff0c;并且这个自定义组件里面放一…

用无代码搭建数据中台,竟做到如此丝滑

文章目录 需求背景系统介绍配置说明1 菜单导航2 系统自带组件导入页面&#xff08;1&#xff09;数据集成相关组件&#xff08;2&#xff09;数据服务相关组件 3 由系统组件路径添加页面&#xff08;1&#xff09;数据资产管理&#xff08;2&#xff09;数据标准管理&#xff0…