Сначала давайте установим наши библиотеки: kivy и pytube. Чтобы установить их, откройте свой терминал и напишите эти

pip install pytube
pip install kivy 
pip install kivymd

Теперь давайте установим наши библиотеки в код. Мы не собираемся использовать все виджеты в этих библиотеках, поэтому я буду импортировать только часть из них.

from pytube import YouTube
from kivymd.uix.relativelayout import MDRelativeLayout
from kivymd.app import MDApp
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput 
from kivy.uix.image import Image 
from kivy.uix.button import Button 
from kivymd.uix.list import OneLineListItem,MDList
from kivy.uix.scrollview import ScrollView
from kivy.core.window import Window

import os as os

Сначала давайте создадим размер нашего окна. Я сделаю 720/600. Но вы можете сделать это, как хотите. Возможно, вам придется внести небольшие коррективы в код, хотя… Также давайте создадим класс и создадим приложение.

Window.size = (720,600)
class Yt(MDApp):
   

Теперь мы хотим сделать функцию. В этой функции у нас будут наши виджеты, такие как кнопки, метки, текстовые вводы и изображения. Виджеты имеют так много разных атрибутов, что вы можете использовать разные атрибуты или изменять их значения.

def build(self):
            self.icon = "Assets\\1077046.png"
            layout = MDRelativeLayout(md_bg_color = [0,1,1]) # using with RGB code 
            # size hint means that it makes the size of the widget according to the apps default resolution. Pos_hint makes the same thing with about widget placement.
            # you can use different images and icons just dont forget to enter their path correctly
tly

            self.img = Image(source='Assets\download-removebg-preview.png',size_hint=(.5,.5),pos_hint={'center_x':0.5,'center_y':0.9}) 
            self.linkinput = TextInput(text="",pos_hint={'center_x':0.5,'center_y':0.65},size_hint=(1,None),height=48,font_size=29,foreground_color=(34/255,139/255,34/255),)
            self.label = Label(text="Enter the link of the video which you want to download to your device ", pos_hint = {"center_x":0.5,"center_y":0.75},size_hint=(.3,.3),font_size=20,color=(0,100/255,0))
            self.button = Button(text="Download",size_hint=(0.15,0.15),pos_hint = {"center_x":0.5,"center_y":0.50},background_color=(34/255,139/255,34/255) 
            # We divide the RGB codes to 255 because kivy only allows values between 0 to 1.
            self.res_link_input = TextInput(text="",pos_hint = {"center_x":0.1,"center_y":0.1},size_hint=(.2,.1),font_size=40,foreground_color=(34/255,139/255,34/255))

Теперь давайте добавим эти виджеты в наш макет. Это означает, что наше основное приложение

            layout.add_widget(self.label)
            layout.add_widget(self.img)
            layout.add_widget(self.linkinput)
            layout.add_widget(self.button)
            layout.add_widget(self.res_link_input)
            return layout 

Теперь нам нужно получить значение textinput и прикрепить функцию к нашей кнопке. Мы хотим, чтобы кнопка загружала видео по ссылке, которую мы написали в linkinput, когда она нажата. Мы должны создать другую функцию, чтобы сделать это

def OnClicked(self,button):
            input_value = self.linkinput.text #gets the value from the input 
            res_value = self.res_link_input.text # makes the linkinput value text 
            button.disabled = True # cannot press he button
            try:
                youtube_object = YouTube(input_value, use_oauth=True, allow_oauth_cache=True) # Creating the youtube obect
                youtube_object.streams.filter(res=f"{res_value}p").first().download()# filtering the resolution so we can download which resolution we want
                self.success = Label(text="Video has been downloaded succesfully  ", pos_hint = {"center_x":0.5,"center_y":0.3},size_hint=(.3,.3),font_size=20,color=(0,100/255,0))

                
            except :
                print("An error has occurred:" )
            

Теперь давайте создадим основную функцию для запуска приложения:

if __name__ == '__main__':
    Yt().run()

Окончательный код:

from pytube import YouTube
from kivymd.uix.relativelayout import MDRelativeLayout
from kivymd.app import MDApp
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput 
from kivy.uix.image import Image 
from kivy.uix.button import Button 
from kivymd.uix.list import OneLineListItem,MDList
from kivy.uix.scrollview import ScrollView
from kivy.core.window import Window

import os as os

try:

    Window.size = (720,600)
    
    class Yt(MDApp):

        def build(self):
            self.icon = "Assets\\1077046.png"
            layout = MDRelativeLayout(md_bg_color = [0,1,1])



            self.img = Image(source='Assets\download-removebg-preview.png',size_hint=(.5,.5),pos_hint={'center_x':0.5,'center_y':0.9}) # size hint means that it makes the size of the widget according to the apps default resolution. Pos_hint makes the same thing with about widget placement 
            self.linkinput = TextInput(text="",pos_hint={'center_x':0.5,'center_y':0.65},size_hint=(1,None),height=48,font_size=29,foreground_color=(34/255,139/255,34/255),)
            self.label = Label(text="Enter the link of the video which you want to download to your device ", pos_hint = {"center_x":0.5,"center_y":0.75},size_hint=(.3,.3),font_size=20,color=(0,100/255,0))
            self.button = Button(text="Download",size_hint=(0.15,0.15),pos_hint = {"center_x":0.5,"center_y":0.50},background_color=(34/255,139/255,34/255))
            self.button.bind(on_release=self.OnClicked)
            self.res_link_input = TextInput(text="",pos_hint = {"center_x":0.1,"center_y":0.1},size_hint=(.2,.1),font_size=40,foreground_color=(34/255,139/255,34/255))

            

            layout.add_widget(self.label)
            layout.add_widget(self.img)
            layout.add_widget(self.linkinput)
            layout.add_widget(self.button)
            layout.add_widget(self.res_link_input)
            return layout 

        def OnClicked(self,button):
            input_value = self.linkinput.text
            res_value = self.res_link_input.text
            button.disabled = True
            
            
            try:
                youtube_object = YouTube(input_value, use_oauth=True, allow_oauth_cache=True)
                youtube_object.streams.filter(res=f"{res_value}p").first().download()
                self.success = Label(text="Video has been downloaded succesfully  ", pos_hint = {"center_x":0.5,"center_y":0.3},size_hint=(.3,.3),font_size=20,color=(0,100/255,0))

                
            except :
                print("An error has occurred:" )
            
except:
    print("there was an error")


if __name__ == '__main__':
    Yt().run()

Окончательный результат будет таким:

Спасибо за прочтение! Также не забудьте попробовать сделать его красивее :) если вам понравился этот пост, вы можете посмотреть другой мой пост. Увидимся в следующий раз…

👋 Если вы считаете это полезным, пожалуйста, несколько раз нажмите кнопку аплодисментов 👏 ниже, чтобы выразить свою поддержку автору 👇

🚀Присоединяйтесь к сообществу разработчиков FAUN и получайте похожие истории в свой почтовый ящик каждую неделю