python - 如何阻止 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 应用程序不响应
提前致谢!
解决方案
问题是,当您下载视频时,tkinter
窗口并未更新。这就是为什么 Windows 说它没有响应。您尝试使用app.root.update_idletasks()
但未.update_idletasks()
处理某些事件来解决此问题,因此 Windows 将假定程序无响应。如果您更改.update_idletasks()
为.update()
,它将处理所有事件并且窗口将停止无响应。
这种方法的问题是,如果pytube
使用线程,它可能会崩溃tkinter
。我不知道pytube
内部如何运作。这就是为什么@Matiiss 建议将下载器放在另一个更新全局变量的线程中。这是更安全的方法,但需要大量编码。
推荐阅读
- react-native - 如何从 react-native-datepicker 获取 unix 时间戳格式的日期?
- c# - 如何从一个列表中的属性中获取随机值?
- java - FileInputStream 找不到文件 intelliJ 思路
- angular5 - 从 Angular 4 更新到 Angular 5 后自定义 FormControl 失败
- laravel - 带有逗号分隔字段的 Laravel Eloquent 关系
- hibernate - spring boot jpa hibernate - 获取主详细数据
- c - 程序没有错误但仍然崩溃
- jupyter-notebook - Jupyter Notebook“笔记本已更改”不断出现
- javascript - 具有固定宽度和高度的项目的网格
- r - R : 从主脚本调用外部子程序 R 脚本以避免等待子程序