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 文本,因为它们处于不同的执行线程中。

Video Example