如何在CustomTkinter的YouTube下载器中添加Progressbar进度条
实现CustomTkinter进度条与YouTube下载进度关联的方案
要实现进度条和下载进度的关联,核心是利用Pytube提供的进度回调机制,结合CustomTkinter的CTkProgressBar组件。下面是具体的修改方案:
关键修改点
- 提前创建
CTkProgressBar组件,初始状态隐藏 - 实例化
YouTube对象时,通过on_progress_callback参数绑定进度更新函数 - 在进度回调函数中计算已下载百分比,实时更新进度条的值
- 在
try块中控制进度条的显示与重置,except块中处理错误提示并隐藏进度条
修改后的完整代码
import customtkinter as ctkt from pytube import YouTube import os path = os.getcwd() ctkt.set_appearance_mode("dark") ctkt.set_default_color_theme("dark-blue") root = ctkt.CTk() root.geometry("500x500") root.title("Youtube Downloader") root.resizable(False, False) # 全局复用状态标签和进度条,避免重复创建组件 status_label = ctkt.CTkLabel(master=root, text="") status_label.pack(pady=5) progress_bar = ctkt.CTkProgressBar(master=root, width=300) progress_bar.set(0) progress_bar.pack(pady=5) progress_bar.pack_forget() # 初始隐藏进度条 def update_progress(stream, chunk, bytes_remaining): """进度回调函数:计算并更新进度条""" total_size = stream.filesize bytes_downloaded = total_size - bytes_remaining percentage = (bytes_downloaded / total_size) * 100 progress_bar.set(percentage / 100) # CTkProgressBar接受0-1之间的数值 root.update_idletasks() # 强制刷新UI,避免卡顿 def downloadVid(): # 重置状态和进度条 status_label.configure(text="") progress_bar.set(0) progress_bar.pack_forget() try: ytLink = link.get().strip() if not ytLink: status_label.configure(text="[-] 请输入视频链接") return # 绑定进度回调的YouTube实例 ytObject = YouTube(ytLink, on_progress_callback=update_progress) video = ytObject.streams.get_highest_resolution() # 显示进度条,更新当前下载状态 progress_bar.pack(pady=5) status_label.configure(text=f"[+] 正在下载:{ytObject.title}") video.download(output_path=path) status_label.configure(text="[+] 下载完成!") progress_bar.set(1) # 进度条拉满 except Exception as e: status_label.configure(text="[-] 链接无效或下载失败") progress_bar.pack_forget() link = ctkt.CTkEntry(master=root, width=300, height=20, placeholder_text="粘贴视频链接...") link.pack(pady=15, padx=15) dowloadBtn = ctkt.CTkButton(master=root, command=downloadVid, text="下载") dowloadBtn.pack(pady=15, padx=15) def open_videos(): os.startfile(path) open_folder = ctkt.CTkButton(master=root, command=open_videos, text="打开保存目录") open_folder.pack() root.mainloop()
代码说明
- 全局组件复用:把状态标签和进度条设为全局变量,避免每次下载创建新组件导致界面混乱
- 进度回调函数:
update_progress接收Pytube传递的下载数据,计算百分比后更新进度条,并用root.update_idletasks()强制刷新UI - try块逻辑优化:增加空链接判断,下载前显示进度条和当前下载标题,完成后更新状态并拉满进度条
- 异常处理:捕获错误后隐藏进度条并显示错误提示
内容的提问来源于stack exchange,提问作者Marius Prakash
相关产品推荐
相关产品推荐

