使用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
相关产品推荐
相关产品推荐

