如何在Python海龟绘图时同步录成gif和视频?

发布时间 2023-06-06 08:06:25作者: 李兴球

如何在Python海龟绘图时同步把它的每个步骤录成gif和视频文件呢?这里提供了一个最简单的方法,只要调用两个命令即可。一个叫makegif,顾名思义即生成gif。另一个叫makevideo,顾名思义是生成视频的意思。这两个命令都来自gameturtle模块,所以需要安装,安装方法已经说明。

由于这个程序会调用fill命令对五角星的的几个区域进行填充,所以借用了sprites模块的fill命令。还有就是在绘图中需要保存每一“帧”图到内存中。这里运用了sprites模块中屏幕的save命令。所以从sprites模块中导入了Screen命令。sprites库中的Screen命令是turtle模块中Screen命令的增强版。而sprites库中的Sprite命令则是turtle模块中Turtle命令的增强版本。不过,本程序并没有用到Sprite命令,至于showinfo则只是消息对话框用于显示消息。需要注意的是如果使用了sprites模块,则海龟默认是抬笔的。注意是先导入turtle库,再from sprites import ....。为什么要这样呢?因为sprites库会对turtle库中的一些类进行重定义,所以顺序不能搞反了!!!

import turtle
from sprites import fill,Screen,showinfo # pip install sprites --upgrade
from gameturtle import makegif,makevideo # pip install gameturtle --upgrade

screen = Screen()   # Screen命令是turtle模块中Screen命令的增强版
screen.setup(480,360)
# 鼠标移动事件,在标题栏里显示鼠标指针的坐标
screen.onmousemove(lambda x,y:screen.title(f"{x},{y}"))
 
turtle.pensize(5)
turtle.pendown() # 如果使用了sprites模块,则海龟默认是抬笔的。
frames =[]       # 新建列表
for i in range(5):
    # 前进并且保存当前画面到列表
    turtle.fd(200);frames.append(screen.save()) 
    turtle.right(144);frames.append(screen.save())
turtle.penup()
turtle.hideturtle()
frames.append(screen.save())         # 屏幕截取到frames列表中

cs = ['red','orange','yellow','green','cyan','blue']
cors = [(47,-16),(100,25),(153,-16),(133,-78),(63,-78),(96,-34)]
for fc,xy in zip(cs,cors):      
    fill(*xy,fillcolor=fc)        # 填充区域,默认采用洪水填充方式 
    frames.append(screen.save())

makegif(frames,'生成的动图.gif')        # 生成动图
makevideo(frames,'生成的视频.mp4')      # 生成mp4视频
showinfo('提示','gif和mp4文件生成完毕')
         
screen.mainloop()

在程序的运行过程中,会把海龟的每步移动或旋转过程的画面都放在frames列表中。这个画面被存储为pillow图形对象。在最后会调用gameturtle模块中的makegif和makevideo把它们压制成动图和视频文件。至于原理,有兴趣的同学可以自己查看gameturtle模块的代码。这个模块也是本人开发的,也开源了,所以可以下载到它的源代码以进行查看。

以下是生成的gif文件:

以下是生成的视频文件:由于视频无法插入,请到本人的:李兴球Python 微信公众号去查看。