You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CustomTkinter中显示GIF或MP4?求技术帮助

在CustomTkinter中播放GIF动画

你当前的代码只能显示GIF的第一帧,因为CTkImage本身不支持解析GIF的帧序列并播放动画。要实现GIF动态播放,需要借助PIL的ImageSequence模块逐帧更新标签的图像,具体实现如下:

实现步骤

  • 用PIL加载GIF文件,通过ImageSequence.iter_frames()获取所有动画帧
  • 创建CTkLabel作为显示容器
  • 编写帧更新函数,循环切换标签的image属性
  • 利用after()方法定时触发帧更新,形成动画效果

完整代码示例

import customtkinter
from PIL import Image, ImageSequence

class App(customtkinter.CTk):
    def __init__(self):
        super().__init__()
        self.title("GIF Player")
        self.geometry("1282x720")

        # 加载GIF并提取所有帧
        self.gif_path = "resources/images/background.gif"
        self.gif_frames = [frame.copy() for frame in ImageSequence.Iterator(Image.open(self.gif_path))]
        self.current_frame = 0

        # 初始化显示标签
        self.logo = customtkinter.CTkImage(dark_image=self.gif_frames[0], size=(1282, 720))
        self.logo_label = customtkinter.CTkLabel(master=self, text='', image=self.logo)
        self.logo_label.pack()

        # 启动动画
        self.update_gif()

    def update_gif(self):
        # 更新当前帧索引
        self.current_frame = (self.current_frame + 1) % len(self.gif_frames)
        # 转换当前帧为CTkImage
        current_ctk_image = customtkinter.CTkImage(dark_image=self.gif_frames[self.current_frame], size=(1282, 720))
        # 更新标签图像
        self.logo_label.configure(image=current_ctk_image)
        # 保留引用防止图像被垃圾回收
        self.logo_label.image = current_ctk_image
        # 定时调用更新函数(这里100ms是帧间隔,可根据GIF实际帧率调整)
        self.after(100, self.update_gif)

if __name__ == "__main__":
    app = App()
    app.mainloop()

关键说明

  • 帧提取:ImageSequence.Iterator会遍历GIF的每一帧,需要用copy()保存帧对象,避免后续操作丢失帧数据
  • 定时更新:after()方法是Tkinter系库的定时机制,参数中的毫秒数决定了动画的播放速度,可根据GIF的实际帧率调整(比如24帧/秒对应约42ms)
  • 图像引用:更新标签图像后必须保留对CTkImage对象的引用,否则Python的垃圾回收会回收图像资源,导致标签显示空白

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:02:39