《Python趣味工具》——自制emoji3
今日目标
在上次,我们绘制了静态的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()函数将角度设置为0seth(0)# 使用forward()函数前进x步forward(x)# 使用pendown()函数落笔pendown()# 使用pensize()函数设置画笔粗细为15pensize(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. 绘制表情包文字:
接下来我们需要制作表情包文字。
步骤如下:
- 用input函数邀请用户输入自定义文字内容。
- 定义一个write_emoji()函数书写文字内容。

具体怎么输出文字我们在《Python趣味工具》——自制emoji(1)绘制爱心应援牌❤️里已经讲过了,大家可以自行参考。
# 使用input()函数引导用户输入表情包语录
# 文案内容为"请输入表情包语录:"
content=input("请输入表情包语录:")# 定义一个write_emoji()函数书写文字
def write_emoji():# 使用penup()函数抬起画笔penup()# 使用fillcolor()函数将填充颜色设置为blackfillcolor("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图片反复切换播放,实现动图效果,也就是:
- 展示emoji1
- 刷新屏幕
- 暂停一段时间(这个根据自己的实际情况看着写,不停顿效果可能会很鬼畜)
- 展示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)# 计数器加1n = 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")# 将画笔粗细设置为4pensize(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()函数设置画笔粗细为20pensize(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()函数将角度设置为0seth(0)# 使用forward()函数前进x步forward(x)# 使用pendown()函数落笔pendown()# 使用pensize()函数设置画笔粗细为15pensize(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()函数将填充颜色设置为blackfillcolor("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)# 计数器加1n = 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()


相关文章:
《Python趣味工具》——自制emoji3
今日目标 在上次,我们绘制了静态的emoji图。并且总结了turtle中的常用函数。 本次我们将尝试制作一个动态的emoji,让你的表情包动起来! 文章目录 一、动画原理:二、制作动画:1. 修改eyes_black()函数:2. 绘…...
怎么把录音转换成mp3格式
怎么把录音转换成mp3格式?在我们平时的学习和工作中,经常会使用设备进行录音(例如电脑、手机和录音笔等)。然而,这些录音文件往往存在各种不同的格式,不同手机不同品牌的录音笔得到的录音文件都不相同&…...
基于遗传算法改进的BP神经网络图像分割,BP神经网络基本原理,遗传算法流程,
目录 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 遗传算法的原理及步骤 基于遗传算法改进BP神经网络的二分类 代码 效果图 结果分析 展望 完整代码和数据下载:遗传算法优化BP神经网络的图像分…...
uni-app 之 文字分两行显示超出用省略号表示
uni-app 之 文字分两行显示超出用省略号表示 vue 将一大串文字分两行显示超出用省略号表示 通过css设置文字强制不换行超出用省略号表示: {white-space: nowrap; 文本强制不换行;text-overflow:ellipsis; 文本溢出显示省略号;overflow:hidden; 溢出的部…...
stl_stack_queue的使用及OJ题
stl_stack_queue的使用及OJ题 stl_stack_queue的使用相关OJ题 stl_stack_queue的使用 #include <iostream> #include <stack> #include <queue> using namespace std;void test_stack() {stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);…...
Linux下的Docker安装,以Ubuntu为例
Docker是一种流行的容器化平台,它能够简化应用程序的部署和管理。 Docker安装 1、检查卸载老版本Docker(为保证安装正确,尽量在安装前先进行一次卸载) apt-get remove docker docker-engine docker.io containerd runc 2、Dock…...
【深度学习 | LSTM】解开LSTM的秘密:门控机制如何控制信息流
🤵♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…...
解决npm install遇到的问题:Error while executing:
目录 一、遇到问题 二、解决办法 方法一 方法二 方法三 方法四 一、遇到问题 npm ERR! Error while executing: npm ERR! D:\IT_base\git\Git\cmd\git.EXE ls-remote -h -t ssh://gitgithub.com/sohee-lee7/Squire.git npm ERR! npm ERR! fatal: unable to access ht…...
常见的内网穿透工具有 ngrok/ localtunnel/ frp
1.内网穿透工具的工作原理 内网穿透工具的工作原理是通过在本地网络和公共网络之间建立一个通道,将公网流量转发到本地网络中的服务。这样,在没有公网 IP 或无法直接访问的情况下,用户可以通过公网访问本地网络中的服务。 2. 常见的内网穿透…...
dvwa命令执行漏洞分析
dvwa靶场命令执⾏漏洞 high难度的源码: $target trim($_REQUEST[ ‘ip’ ]);是一个接收id值的变量 array_keys()函数功能是返回包含原数组中所有键名的一个新数组。 str_replace() 函数如下,把字符串 “Hello world!” 中的字符 “world” 替换为 “S…...
今年嵌入式行情怎么样?
今年嵌入式行情怎么样? 嵌入式技术今年可以说是IT领域中最炙手可热的之一。随着中年危机和内卷问题的出现,越来越多的互联网从业者将目光投向了嵌入式领域。国内的嵌入式市场一直受终端需求变化的影响而波动,但随着国内产业自主化的发展趋势…...
Unity WebGL 编译 报错: emcc2: error: ‘*‘ failed: [WinError 2] ϵͳ�Ҳ���ָ�����ļ���解决办法
文章目录 错误日志可能的原因及解决办法:导出路径不能有中文系统名(win)含有中文, 修改环境变量Temp和Tmp, 如下图:真正的原因: 杀毒软件删除了部分wasm相关文件,如: 错误日志 Building Library\Bee\artifacts\WebGL\build\debug_WebGL_wasm\build.js failed with output: emc…...
三维模型3DTile格式轻量化压缩处理的数据质量提升方法分析
三维模型3DTile格式轻量化压缩处理的数据质量提升方法分析 在处理三维模型3DTile格式的轻量化压缩时,如何在减少数据量的同时,保证或提升数据质量是一大挑战。以下为一些提升数据质量的方法分析: 改进几何简化算法:在进行几何简化…...
Pycharm2022 pycharm64.exe.Vmoptions
Windows Pycharm pycharm64.exe.Vmoptions文件的真正路径 C:\Program Files\JetBrains\PyCharm Community Edition 2022.1.4\bin\pycharm64.exe.vmoptions 在其他路径下修改vmoptions是无效的!!! 文件内容 -Xms128m -Xmx750m -XX:Reserve…...
sql注入之高权限注入和文件读写
死在山野的风里,活在自由的梦里 sql注入之高权限注入和文件读写 高权限注入1.多个网站共享mysql服务器2.MySQL 权限介绍3.注入流程查询所有数据库名称查询表名对应的字段名查询数据 文件读写1.文件读写注入的原理2.文件读写注入的条件3.读取文件4.写入文件 高权限注…...
Java 面经
本文为Java面经,其中讲述的是在面试过程中回答得不好的地方,在这里补充,以便为后面的面试积累经验 哈罗单车 一面 Q:公司的MySQL数据库,事务隔离级别是什么? A:读已提交(RC&…...
无涯教程-JavaScript - ROUNDUP函数
描述 ROUNDUP函数将数字四舍五入,而不是0(零)。 ROUNDUP是Excel四舍五入函数之一。 语法 ROUNDUP (number, num_digits)争论 Argument描述Required/OptionalNumberAny real number that you want rounded up.RequiredNum_digitsThe number of digits to which you want to …...
【Linux旅行记】探究操作系统是如何进行管理的!
文章目录 什么是操作系统?操作系统概念操作系统的目的底层硬件驱动程序操作系统理解系统调用接口 操作系统是如何进行管理的?什么是管理?操作系统是如何管理硬件信息呢? 🍀小结🍀 🎉博客主页&am…...
【Linux C小技巧】零长度数组的使用
本期主题: 讲清Linux C的零长度数组使用,内容包括: 零长度数组是什么原理为什么要使用零长度数组与指针的差异 往期链接: 数据结构系列——先进先出队列queue数据结构系列——栈 stackLinux内核链表 目录 0.前言1.零长度数组原理…...
github 网页显示不全?
问题 解决 1、检查网页,打开 network,重新刷新 github 网页 2、查看无法加载的资源(如 css 文件) 3、查看域名地址 https://tool.chinaz.com/dns/,github.githubassets.com(检查网页元素,点击无…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...
Python的__call__ 方法
在 Python 中,__call__ 是一个特殊的魔术方法(magic method),它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时(例如 obj()),Python 会自动调用该对象的 __call__ 方法…...
嵌入式面试常问问题
以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...
EEG-fNIRS联合成像在跨频率耦合研究中的创新应用
摘要 神经影像技术对医学科学产生了深远的影响,推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下,基于神经血管耦合现象的多模态神经影像方法,通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里,本研…...
