0

我想制作一个使用 pytube 和 kivy 下载 youtube 视频的应用程序。问题是应用程序冻结,然后在下载开始时停止响应。我知道它开始下载,因为它创建了一个 mp4 文件。我研究了调度和多线程,但我不知道它们是如何工作的,我什至不确定它们是否能解决我的问题。谁能告诉我在哪里看?

蟒蛇文件:

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()

基维文件:

 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
4

1 回答 1

0

我最近被自己的线程吓倒了,谈论 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) 你输入网址

2)你点击下载按钮

3) 这会触发 start_download 方法。

4) start_download 创建一个线程来运行您的下载方法,该方法将当前时间的 url.text作为参数。这意味着您可以在下载时输入其他 url,而不会覆盖先前调用中的 url 文本,因为它们处于不同的执行线程中。

视频示例

于 2018-02-05T15:31:58.690 回答