如何实现Python Tkinter弹窗视频播放后自动关闭?
解决方案:Toplevel弹窗播放动画后自动关闭
问题原因
tkvideo的play()方法是异步执行的,直接调用destroy()会在视频开始播放前就执行,或者无法感知播放结束的时机。另外你设置了loop=1,但tkvideo的循环计数逻辑需要结合回调或事件监听才能正确触发关闭操作。
方案1:监听视频播放结束事件(精准关闭)
tkvideo在播放完设定的循环次数后,会向承载视频的Label组件发送<<tkvideoEnd>>事件,我们可以绑定这个事件来关闭窗口:
import tkinter as tk from tkvideo import tkvideo def close_window(event): window.destroy() # 基于已有主根窗口创建Toplevel弹窗 window = tk.Toplevel() window.title("Animation") lbl_video = tk.Label(window) lbl_video.pack() # 绑定播放结束事件 lbl_video.bind("<<tkvideoEnd>>", close_window) # loop=1表示播放1次后停止 player = tkvideo("Hero_Slash_Attack_Animation.mp4", lbl_video, loop=1, size=(500,500)) player.play() # 注意:实际项目中无需单独调用此行,主根窗口已在运行mainloop # window.mainloop()
方案2:强制延迟2秒关闭(简单粗暴)
如果不需要严格等待视频播放结束,只想固定2秒后关闭窗口,可以用tkinter的after()方法,它会在指定毫秒数后执行回调函数:
import tkinter as tk from tkvideo import tkvideo window = tk.Toplevel() window.title("Animation") lbl_video = tk.Label(window) lbl_video.pack() player = tkvideo("Hero_Slash_Attack_Animation.mp4", lbl_video, loop=1, size=(500,500)) player.play() # 2000毫秒=2秒后执行窗口销毁 window.after(2000, window.destroy) # 注意:实际项目中无需单独调用此行,主根窗口已在运行mainloop # window.mainloop()
注意事项
- 确保视频文件路径正确,可放在项目根目录或使用绝对路径
- 实际项目中不要单独调用
window.mainloop(),否则会和主根窗口的事件循环冲突 - 若方案1的事件未触发,可检查视频是否能正常播放完毕,或尝试更新tkvideo到最新版本
内容的提问来源于stack exchange,提问作者Ramon Bustamante
相关产品推荐
相关产品推荐

