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

news/2024/10/17 14:17:26/

今日目标
在上次,我们绘制了静态的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. 绘制表情包文字:

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

步骤如下:

  1. 用input函数邀请用户输入自定义文字内容。
  2. 定义一个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图片反复切换播放,实现动图效果,也就是:

  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)# 计数器加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()

在这里插入图片描述


在这里插入图片描述


http://www.ppmy.cn/news/1115843.html

相关文章

8年经验之谈 —— App测试常用的两种工具

一、监控工具 DDMS的全称是Dalvik Debug Monitor Service ,是Android开发环境中的Dalvik虚拟机调试监控服务。提供测试设备截屏、查看特定进程正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、模拟接收及发送SMS、虚拟地理坐标等服务。 启动DDMS Eclipse中启…

C数据结构二.练习题

一.求级数和 2.求最大子序列问题:设给定一个整数序列 ai.az..,a,(可能有负数).设计一个穷举算法,求a 的最大值。例如,对于序列 A {1,-1,1,-1,-1,1,1,1,1.1,-1,-1.1,-1,1,-1},子序列 A[5..9](1,1,1,1,1)具有最大值5 3.设有两个正整数 m 和n,编写一个算法 gcd(m,n),求它们的最大公…

mysql远程连接失败

先上结论&#xff0c;只提出最容易忽略的地方 服务器是阿里云、腾讯云等平台&#xff0c;平台本身自带的防火墙没有开启iptables规则中禁用了3306&#xff0c;即使你根本没有启用iptables服务 第二条是最离谱的 从这里可以看到&#xff0c;我服务器并未启用 iptables 服务 但…

基于PyTorch搭建Mask-RCNN实现实例分割

基于PyTorch搭建Mask-RCNN实现实例分割 在这篇文章中&#xff0c;我们将讨论 Mask RCNN Pytorch 背后的理论以及如何在 PyTorch 中使用预训练的 Mask R-CNN 模型。 1. 语义分割、目标检测和实例分割 在之前的博客文章里介绍了语义分割和目标检测&#xff08;如果感兴趣可以参…

什么是RPA?详解RPA工具和应用程序的工作原理!

RPA&#xff08;Robotic Process Automation&#xff09;是一种自动化技术&#xff0c;它利用软件机器人或“机器人”来模拟人类操作&#xff0c;自动执行一系列重复性、规则化的业务流程。通过使用RPA&#xff0c;企业可以节省时间和人力成本&#xff0c;提高工作效率和准确性…

递归视角下

def listSum(numbers): if not numbers: return 0 else: (f, rest) numbers return f listSum(rest)myList (1, (2, (3, (4,None))))total listSum(myList)print(total) while循环何时退出&#xff1f; 恐怕是while循环技巧所在&#xff0c;即选择恰…

有多条业务线,mysql建多库多表比较好还是一个库多个表比较好呢?

选择使用多库多表还是一个库多个表&#xff0c;取决于你的具体情况和需求。以下是一些考虑因素&#xff1a; 数据隔离&#xff1a;如果每条业务线需要完全独立的数据隔离&#xff0c;例如不同业务线的数据不会相互关联或共享&#xff0c;那么使用多库可以更好地实现数据隔离。 …

文字转语音真人发声怎么弄?3款亲测好用的智能配音软件

现在AI人工智能语音技术已经比较发达了&#xff0c;可能很多朋友会发现影视解说经常遇到耳熟的声音&#xff0c;其实就是AI配音效果&#xff0c;才会这么相似。 今天就给大家分享3个好用的AI配音工具&#xff0c;希望对你有所帮助&#xff01; 一、&#xff1a;悦音配音 悦音…