基于Tkinter的带播放列表视频播放器仅能播放首尾视频求助
问题分析与修复
你的代码有两个关键问题导致只能播放首尾视频:
视频路径不完整
你通过os.walk获取的只是文件名,没有拼接文件所在的目录路径。TkinterVideo需要完整路径才能找到视频文件,中间的视频因为路径错误加载失败,触发<<Ended>>事件后直接跳到下一个,直到迭代器走到最后一个元素。路径字符串未处理转义
origem = "C:\Python\Estudos\Videos"中的反斜杠会被Python解析为转义字符,可能导致路径识别错误,部分视频无法被正确遍历到。
修复后的代码
import functools import tkinter as tk from tkVideoPlayer import TkinterVideo import os # 用原始字符串避免路径转义问题 origem = r"C:\Python\Estudos\Videos" lista = [] # 遍历文件夹,存储完整视频路径 for root_dir, _, files in os.walk(origem): for arquivo in files: full_path = os.path.join(root_dir, arquivo) # 过滤常见视频格式,避免加载非视频文件 if full_path.lower().endswith(('.mp4', '.avi', '.mov', '.mkv')): lista.append(full_path) def load_v(video): try: videoplayer.load(video) print(f"已加载: {video}") except Exception as e: print(f"加载失败: {video}, 错误: {e}") def play_v(): videoplayer.play() def play_next_video(event, videoplayer, playlist): next_video = next(playlist, None) print('下一个视频:', next_video) if not next_video: print("播放完成") return load_v(next_video) play_v() if __name__ == "__main__": root = tk.Tk() root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight())) root.overrideredirect(True) videoplayer = TkinterVideo(master=root, scaled=True) videoplayer.pack(expand=True, fill="both") if not lista: print("未找到任何视频文件") root.destroy() else: playlist = iter(lista) first_video = next(playlist) load_v(first_video) play_v() videoplayer.bind("<<Ended>>", functools.partial(play_next_video, videoplayer=videoplayer, playlist=playlist)) root.mainloop()
优化点说明
- 存储视频的完整路径,确保TkinterVideo能准确定位文件。
- 使用原始字符串处理路径,避免转义错误。
- 添加视频格式过滤,跳过非视频文件。
- 增加异常捕获和状态打印,方便调试问题。
- 增加空列表判断,避免无视频时程序空跑。
内容的提问来源于stack exchange,提问作者Saulo Somavilla
相关产品推荐
相关产品推荐

