如何结合 pytube 和 tkinter 标签来显示进度? [英] How to combine pytube and tkinter label to show progress?

查看:27
本文介绍了如何结合 pytube 和 tkinter 标签来显示进度?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写从 youtube 下载歌曲的小程序(使用 pytube)并且我想添加 python tkinter GUI 以在文件下载时显示百分比值.

I am writing small program which downloads song from youtube (using pytube) and I want to add python tkinter GUI to show percent value when the file is downloading.

现在,当我执行我的代码时,程序首先下载文件(大约需要 60 秒),然后才显示 100% 的标签.如果我想在下载文件的同时看到标签值从 0% 上升到 100%,我应该在代码中更改什么?

Now when I execute my code, program at first downloads the file (takes about 60sec) and only then shows the label with 100%. What should I change in my code if I want to see label value climbing from 0% to 100% at the same time when the file is been downloaded?

代码 Python3:

Code Python3:

from pytube import YouTube
import tkinter as tk
from tkinter import ttk

# main application shows:
# label Loading..
# label which configure values when file is downloading 
# inderterminate progress bar
class MainApplication(tk.Frame):

def __init__(self, master=None, *args, **kwargs):
    tk.Frame.__init__(self, master)
    self.master = master

    self.master.grid_rowconfigure(0, weight=0)
    self.master.grid_columnconfigure(0, weight=1)

    self.youtubeEntry = "https://www.youtube.com/watch?v=vVy9Lgpg1m8"
    self.FolderLoacation = "C:/Users/Jonis/Desktop/"

    # pytube
    self.yt = YouTube(self.youtubeEntry)

    video_type = self.yt.streams.filter(only_audio = True).first()

    # file size of a file
    self.MaxfileSize = video_type.filesize

    # Loading label
    self.loadingLabel = ttk.Label(self.master, text="Loading...", font=("Agency FB", 30))
    self.loadingLabel.grid(pady=(100,0))

    # loading precent label which must show % donwloaded
    self.loadingPercent = tk.Label(self.master, text="", fg="green", font=("Agency FB", 30))
    self.loadingPercent.grid(pady=(30,30))

    # indeterminate progress bar
    self.progressbar = ttk.Progressbar(self.master, orient="horizontal", length=500, mode='indeterminate')
    self.progressbar.grid(pady=(50,0))
    self.progressbar.start()    

    # call Download file func
    self.DownloadFile


def DownloadFile(self):
    self.yt.register_on_progress_callback(self.show_progress_bar)
    self.yt.streams.filter(only_audio=True).first().download(self.FolderLoacation)

# func count precent of a file
def show_progress_bar(self, stream=None, chunk=None, file_handle=None, bytes_remaining=None):

    # loadingPercent label configure value %
    self.loadingPercent.config(text=str(100 - (100*(bytes_remaining/self.MaxfileSize))))


root = tk.Tk()
root.title("Youtube downloader")
root.geometry("1920x1080")
app = MainApplication(root)
root.mainloop()` 

推荐答案

问题似乎是你需要调用 self.DownloadFileself.show_progress_bar 与您提到的同时.同时调用这两个函数最好的办法是使用线程库

The issue which appears to be is that you need to call self.DownloadFile and self.show_progress_bar at the same time as you mentioned. To call both functions at the same time the best solution is to use thread library

from pytube import YouTube
import tkinter as tk
from tkinter import ttk
import threading


# main application shows:
# label Loading..
# label which configure values when file is downloading 
# inderterminate progress bar
class MainApplication(tk.Frame):

def __init__(self, master=None, *args, **kwargs):
    tk.Frame.__init__(self, master)
    self.master = master

    self.master.grid_rowconfigure(0, weight=0)
    self.master.grid_columnconfigure(0, weight=1)

    self.youtubeEntry = "https://www.youtube.com/watch?v=vVy9Lgpg1m8"
    self.FolderLoacation = "C:/Users/Jonis/Desktop/"

    # pytube
    self.yt = YouTube(self.youtubeEntry)

    video_type = self.yt.streams.filter(only_audio = True).first()

    # file size of a file
    self.MaxfileSize = video_type.filesize

    # Loading label
    self.loadingLabel = ttk.Label(self.master, text="Loading...", font=("Agency FB", 30))
    self.loadingLabel.grid(pady=(100,0))

    # loading precent label which must show % donwloaded
    self.loadingPercent = tk.Label(self.master, text="0", fg="green", font=("Agency FB", 30))
    self.loadingPercent.grid(pady=(30,30))

    # indeterminate progress bar
    self.progressbar = ttk.Progressbar(self.master, orient="horizontal", length=500, mode='indeterminate')
    self.progressbar.grid(pady=(50,0))
    self.progressbar.start()    

    threading.Thread(target=self.yt.register_on_progress_callback(self.show_progress_bar)).start()

    # call Download file func
    threading.Thread(target=self.DownloadFile).start()



def DownloadFile(self):


    self.yt.streams.filter(only_audio=True).first().download(self.FolderLoacation)

# func count precent of a file
def show_progress_bar(self, stream=None, chunk=None, file_handle=None, bytes_remaining=None):

    # loadingPercent label configure value %
    self.loadingPercent.config(text=str(int(100 - (100*(bytes_remaining/self.MaxfileSize)))))


root = tk.Tk() 
root.title("Youtube downloader")
root.geometry("1920x1080")
app = MainApplication(root)
root.mainloop()

这篇关于如何结合 pytube 和 tkinter 标签来显示进度?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆