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()
关键修改点说明
- 清理冗余代码:删除重复的
tkinter导入和不必要的全局变量,避免命名冲突 - 修正Label参数:将错误的
Label(Image = my_img)改为规范的tk.Label(new_root, image=my_img) - 更新图片缩放方法:用
Image.Resampling.LANCZOS替换过时的Image.ANTIALIAS,适配新版PIL库 - 添加视频结束触发逻辑:在视频帧循环结束后,通过
root.after调度新窗口创建,保证GUI操作在主线程执行 - 保留图片引用:给标签绑定图片对象引用,防止Python垃圾回收机制导致图片不显示
- 规范线程设置:用
thread.daemon = True替代1,代码可读性更强
这样修改后,视频播放完成后会自动弹出新窗口显示指定图片,同时不会再出现参数错误的问题。
内容的提问来源于stack exchange,提问作者Ray Hood
相关产品推荐
相关产品推荐

