如何阻止 pytube python 应用程序不响应?

How to stop pytube python app from not responding?

问题

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

没有响应:

无响应后:

我试过的

我尝试使用 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 应用程序不响应

提前致谢!

问题是在您下载视频时 tkinter window 没有更新。这就是 Windows 说它没有响应的原因。您尝试使用 app.root.update_idletasks() 修复该问题,但 .update_idletasks() 不处理某些事件,因此 Windows 将假定程序无响应。如果将 .update_idletasks() 更改为 .update(),它将处理所有事件并且 window 将停止无响应。

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

使用线程模块 运行 在后台处理此进程。 这是一个使用 thread

的例子
def func_thread(your_Arguments):
    from threading import Thread
    th=Thread(target=labmda: yourfunction(arguments...))
    th.setDaomon(True)
    th.start()