欢迎关注深入 Python 的专栏:
恍然大明白www.zhihu.com本文代码在此:
https://github.com/JiangChuanGo/examples/tree/master/PySimpleGUIDemos/showGIFgithub.com虽然 PySimpleGUI 的定位是简单的 GUI 开发工具,但是也提供了在界面内播放动态图片的能力。
GIF
GIF 是一种常见的图片格式,它可以按帧保存一组图像序列。
如果这些图像之间保持一定的连续性,当快速在这些图像的时候,就看起来像是在播放 “视频”。卡通动画也是这样的原理。
播放 GIF 的问题就转换为,按照 GIF 帧序列,定时更新显示内容。
绘制静态图片
依然从最简单的开始,先绘制一张静态图片,你可以在这里下载到可用的 GIF 图:
https://github.com/PySimpleGUI/PySimpleGUI/tree/master/GIFsgithub.com还是熟悉的套路,先设计 layout:
import
UI 非常简单,分别有:
- 开始、停止、退出 3 个按钮;
- 一个 Image 用于显示;
这里使用 dots_wave.gif 文件。事件循环中可以只简单的处理退出事件,就可以看到一张静态图片。
实际上 dots_wave.gif 是动图,正如前面所说,GIF 文件包含成序列的一组图像,需要更新才能形成 “动态” 的感觉。
目前没有更新,显示的就只是 dots_wave.gif 的第一帧图像。
显示 GIF
PySimpleGUI 的 window.read 方法默认是阻塞的,显然我们需要定时执行更新 Image 的任务,所以 read 方法需要使用非阻塞版本,也就是要带 timeout 参数:
while
这样每 10 毫秒就可以更新一次 Image。
可以通过 Image.UpdateAnimation 方法更新显示图像,两个关键参数:
- filename,显示的图像,这里与 layout 定义时一致,就是我们要显示的 GIF 图 dots_wave.gif;
- time_between_frames,GIF 切换帧的时间间隔,单位是毫秒,这里取 50。
img
最后,通过对 "Play"、"Stop" 按钮事件的响应,修改标识变量的状态,控制是否调用 UpdateAnimation 更新显示,就可以实现对播放的控制。
效果
关注公众号 “江川Go”,了解程序员的烧脑日常。