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

Python Tkinter实现视频播放完成后自动打开新GUI窗口及代码报错问题求助

修复代码中的两个问题:图片报错与视频结束触发新窗口

我来帮你一步步解决这两个问题:

问题1:解决“unknown option "-Image"”报错

这个错误有两个核心原因:

  • 参数名大小写错误:tkinter的Label组件接收图片的参数是小写的image,不是大写的Image
  • 全局变量与库名冲突:你声明的global Image会直接覆盖从PIL导入的Image类,导致后续图片处理逻辑混乱,完全不需要这些冗余的全局变量声明

问题2:实现视频播放完成后打开新GUI窗口

原来的代码只是循环播放视频帧,但没有检测视频是否播放完毕。由于tkinter的GUI操作必须在主线程执行,我们需要在视频帧循环结束后,用root.after调度打开新窗口的逻辑,避免线程冲突。

修改后的完整代码

import tkinter as tk
import threading
import imageio
from PIL import Image, ImageTk

video_name = "C:\\Users\\Ray\\Desktop\\Duplicate.mp4"
video = imageio.get_reader(video_name)

def stream(label, root):
    # 循环播放视频每一帧
    for image in video.iter_data():
        frame_image = ImageTk.PhotoImage(Image.fromarray(image))
        label.config(image=frame_image)
        label.image = frame_image
    # 视频播放完成后,调度打开新窗口的操作(确保在主线程执行)
    root.after(0, open_new_window)

def open_new_window():
    # 创建新的GUI窗口
    new_root = tk.Toplevel()
    new_root.title("视频播放完成")
    new_root.geometry("1920x1050")
    
    # 在新窗口中显示图片
    ima = Image.open('C:\\Users\\Ray\\Desktop\\July_bill.jpg')
    # 替换过时的ANTIALIAS,使用PIL推荐的LANCZOS
    ima = ima.resize((1920, 1050), Image.Resampling.LANCZOS)
    my_img = ImageTk.PhotoImage(ima)
    my_lbl = tk.Label(new_root, image=my_img)
    my_lbl.image = my_img  # 保留图片引用,防止被垃圾回收导致不显示
    my_lbl.pack(fill=tk.BOTH, expand=True)

if __name__ == "__main__":
    root = tk.Tk()
    root.title("视频播放窗口")
    root.geometry("1920x1050")
    
    my_label = tk.Label(root)
    my_label.pack(fill=tk.BOTH, expand=True)
    
    # 启动视频播放线程,传入root用于后续GUI调度
    thread = threading.Thread(target=stream, args=(my_label, root))
    thread.daemon = True  # 使用布尔值替代数字1,更符合Python规范
    thread.start()
    
    root.mainloop()

关键修改点说明

  1. 清理冗余代码:删除重复的tkinter导入和不必要的全局变量,避免命名冲突
  2. 修正Label参数:将错误的Label(Image = my_img)改为规范的tk.Label(new_root, image=my_img)
  3. 更新图片缩放方法:用Image.Resampling.LANCZOS替换过时的Image.ANTIALIAS,适配新版PIL库
  4. 添加视频结束触发逻辑:在视频帧循环结束后,通过root.after调度新窗口创建,保证GUI操作在主线程执行
  5. 保留图片引用:给标签绑定图片对象引用,防止Python垃圾回收机制导致图片不显示
  6. 规范线程设置:用thread.daemon = True替代1,代码可读性更强

这样修改后,视频播放完成后会自动弹出新窗口显示指定图片,同时不会再出现参数错误的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:12:27