如何阻止 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()
问题
我的问题是我正在使用 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()