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

如何在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()

代码说明

  1. 全局组件复用:把状态标签和进度条设为全局变量,避免每次下载创建新组件导致界面混乱
  2. 进度回调函数:update_progress接收Pytube传递的下载数据,计算百分比后更新进度条,并用root.update_idletasks()强制刷新UI
  3. try块逻辑优化:增加空链接判断,下载前显示进度条和当前下载标题,完成后更新状态并拉满进度条
  4. 异常处理:捕获错误后隐藏进度条并显示错误提示

内容的提问来源于stack exchange,提问作者Marius Prakash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:38:10