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

使用PyTube与CustomTkinter时进度条更新异常问题求助

问题解决:YouTube下载器进度条提前完成的修复

问题根源

CustomTkinter的CTkProgressBar组件的set()方法仅接受0到1之间的浮点数(0对应0%,1对应100%)。你当前传入的是0-100的百分比整数,当数值大于1时,进度条会直接显示为100%,这就是实际下载仅完成20%左右时进度条就满格的原因。

修复步骤

修改progress_func函数中设置进度条的代码,将百分比数值除以100,转换为0-1的浮点数:

def progress_func(stream, chunk, bytes_remaining):
    """Callback function"""
    total_size = stream.filesize
    bytes_downloaded = total_size - bytes_remaining
    pct_completed = bytes_downloaded / total_size * 100
    percent_status = round(pct_completed, 0)
    percent_int = int(percent_status)
    # 关键修改:将百分比转换为0-1的浮点数
    progress.set(percent_int / 100)
    progress.update_idletasks()
    print(percent_int)

额外说明

  • 终端打印的百分比数值无需修改,依然保持0-100的整数范围,不影响日志查看。
  • 可以移除progress.update_idletasks(),因为CustomTkinter的UI组件会自动处理更新,手动调用并非必须。

完整修复后的代码

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)

progress = ctkt.CTkProgressBar(master=root)
progress.set(0)

def progress_func(stream, chunk, bytes_remaining):
    """Callback function"""
    total_size = stream.filesize
    bytes_downloaded = total_size - bytes_remaining
    pct_completed = bytes_downloaded / total_size * 100
    percent_status = round(pct_completed, 0)
    percent_int = int(percent_status)
    progress.set(percent_int / 100)
    print(percent_int)


def downloadVid():
    try:
        ytLink = link.get()
        ytObject = YouTube(ytLink, on_progress_callback=progress_func)

        video = ytObject.streams.get_highest_resolution()
        video.download()
        succeededMessage = ctkt.CTkLabel(master=root, text="[+] Download Complete")
        succeededMessage.pack()

    except:
        errorMessage = ctkt.CTkLabel(master=root, text="[-] This Link Is Invalid")
        errorMessage.pack()


link = ctkt.CTkEntry(master=root, width=300, height=20, placeholder_text="Paste the video link here...")
link.pack(pady=15, padx=15)


downloadBtn = ctkt.CTkButton(master=root, command=downloadVid, text="Download")
downloadBtn.pack(pady=15, padx=15)

def open_videos():
    os.startfile(path)

open_folder = ctkt.CTkButton(master=root, command=open_videos, text="Saved videos")
open_folder.pack()

progress.pack(pady=20, padx=20)

root.mainloop()

内容的提问来源于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:44:51