Kivy 在下载视频时冻结
Kivy freezing when when downloading video
我想制作一个使用 pytube 和 kivy 下载 youtube 视频的应用程序。问题是应用程序冻结,然后在下载开始时停止响应。我知道它开始下载是因为它创建了一个 mp4 文件。我研究了调度和多线程,但我不知道它们是如何工作的,而且我什至不确定它们是否能解决我的问题。谁能告诉我去哪里找?
python 文件:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from pytube import YouTube
class MyWidget(BoxLayout):
def download_video(self, link):
yt = YouTube(link)
yt.streams.first().download()
class Youtube(App):
pass
if __name__ == "__main__":
Youtube().run()
kivy 文件:
MyWidget:
<MyWidget>:
BoxLayout:
orientation: 'horizontal'
Button:
text: 'press to download'
on_press: root.download_video(url.text)
TextInput:
text: 'paste the youtube URL here'
id: url
最近被线程吓到了,说说GIL吧。然而,线程库本身并不太复杂,这个问题是一个很好的用例。
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from pytube import YouTube
# import Thread from threading
from threading import Thread
class MyWidget(BoxLayout):
# Create a start_download method
def start_download(self):
# Creates a new thread that calls the download_video method
download = Thread(target=self.download_video)
# Starts the new thread
download.start()
def download_video(self):
# I implemented the text grabbing here because I came across a weird error if I passed it from the button (something about 44 errors?)
yt = YouTube(self.ids.url.text)
yt.streams.first().download()
class Youtube(App):
def build(self):
return MyWidget()
if __name__ == "__main__":
Youtube().run()
youtube.kv
<MyWidget>:
orientation: 'horizontal'
Button:
text: 'press to download'
# Call the start download method to create a new thread rather than override the current.
on_press: root.start_download()
TextInput:
text: 'paste the youtube URL here'
id: url
1) 您输入url
2) 您点击下载按钮
3) 这会触发一个 start_download 方法。
4) start_download 创建一个线程来运行您的下载方法,该方法将 url.text 在当前时间 作为参数。这意味着您可以输入额外的 urls,而下载不会覆盖先前调用中的 url 文本,因为它们处于不同的执行线程中。
我想制作一个使用 pytube 和 kivy 下载 youtube 视频的应用程序。问题是应用程序冻结,然后在下载开始时停止响应。我知道它开始下载是因为它创建了一个 mp4 文件。我研究了调度和多线程,但我不知道它们是如何工作的,而且我什至不确定它们是否能解决我的问题。谁能告诉我去哪里找?
python 文件:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from pytube import YouTube
class MyWidget(BoxLayout):
def download_video(self, link):
yt = YouTube(link)
yt.streams.first().download()
class Youtube(App):
pass
if __name__ == "__main__":
Youtube().run()
kivy 文件:
MyWidget:
<MyWidget>:
BoxLayout:
orientation: 'horizontal'
Button:
text: 'press to download'
on_press: root.download_video(url.text)
TextInput:
text: 'paste the youtube URL here'
id: url
最近被线程吓到了,说说GIL吧。然而,线程库本身并不太复杂,这个问题是一个很好的用例。
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from pytube import YouTube
# import Thread from threading
from threading import Thread
class MyWidget(BoxLayout):
# Create a start_download method
def start_download(self):
# Creates a new thread that calls the download_video method
download = Thread(target=self.download_video)
# Starts the new thread
download.start()
def download_video(self):
# I implemented the text grabbing here because I came across a weird error if I passed it from the button (something about 44 errors?)
yt = YouTube(self.ids.url.text)
yt.streams.first().download()
class Youtube(App):
def build(self):
return MyWidget()
if __name__ == "__main__":
Youtube().run()
youtube.kv
<MyWidget>:
orientation: 'horizontal'
Button:
text: 'press to download'
# Call the start download method to create a new thread rather than override the current.
on_press: root.start_download()
TextInput:
text: 'paste the youtube URL here'
id: url
1) 您输入url
2) 您点击下载按钮
3) 这会触发一个 start_download 方法。
4) start_download 创建一个线程来运行您的下载方法,该方法将 url.text 在当前时间 作为参数。这意味着您可以输入额外的 urls,而下载不会覆盖先前调用中的 url 文本,因为它们处于不同的执行线程中。