首页 > 解决方案 > 如何阻止 pytube python 应用程序无响应?

问题描述

问题

我的问题是我正在使用 PyTube 和 Tkinter 创建一个应用程序。但是,当我在插入链接和输出目录后开始下载时,它没有响应,这很糟糕,因为我有一个进度条,当它没有响应时,进度条停止并在无响应消失时结束为零。

没反应:

在此处输入图像描述

无反应后:

在此处输入图像描述

我试过的

我尝试使用该time模块并执行此操作time.sleep(1),但没有成功,因此我将其删除

代码

from tkinter.messagebox import *
import pytube
import requests
import app


def download_video(download_entry, download_path_entry, file_name_entry, progress_bar, progress_label):
    url = "https://yamiatem.github.io/YTDownloader/"
    timeout = 5

    link = download_entry.get()
    out_dir = download_path_entry.get()
    file_name = file_name_entry.get()

    try:
        request = requests.get(url, timeout=timeout)
    except (requests.ConnectionError, requests.Timeout) as exception:
        showerror("Error", "You are not connected to the internet")
        return

    try:
        yt = pytube.YouTube(link)
    except:
        showerror("Error", " YouTube video link is invalid")
        return

    video = yt.streams.filter(progressive=True, mime_type="video/mp4", file_extension="mp4").first()

    def progress_check(chunk, file_handle, bytes_remaining):
        percent = round((float(bytes_remaining) / float(video.filesize)) * float(100))

        progress_bar['value'] = percent
        progress_label.configure(text=str(percent) + "%")

        app.root.update_idletasks()

    yt.register_on_progress_callback(progress_check)

    video.download(output_path=out_dir, filename=file_name)

那么如何阻止 PyTube 和 Tkinter 应用程序不响应

提前致谢!

标签: pythonpython-3.xtkinterpytube

解决方案


问题是,当您下载视频时,tkinter窗口并未更新。这就是为什么 Windows 说它没有响应。您尝试使用app.root.update_idletasks()但未.update_idletasks()处理某些事件来解决此问题,因此 Windows 将假定程序无响应。如果您更改.update_idletasks().update(),它将处理所有事件并且窗口将停止无响应。

这种方法的问题是,如果pytube使用线程,它可能会崩溃tkinter。我不知道pytube内部如何运作。这就是为什么@Matiiss 建议将下载器放在另一个更新全局变量的线程中。这是更安全的方法,但需要大量编码。


推荐阅读