如何在Python海龟绘图时同步录成gif和视频?
如何在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 微信公众号去查看。