[Python] J'ai créé un téléchargeur Youtube avec Tkinter.

1.Tout d'abord

En utilisant Tkinter et Pytube, j'ai créé un programme GUI pour télécharger des vidéos Youtube.

image.png

2.1.pytyube

Veuillez consulter le lien ci-dessous pour savoir comment installer et utiliser Pytube.

https://python-pytube.readthedocs.io/en/latest/

2.2. Introduction du filetage

Introduisez le multi-threading pour Freeze tout en maintenant la réactivité de l'interface graphique.

2.2.1. Ordre des générations

Concevez le fil dans l'ordre suivant. Fonction de rappel du bouton Démarrer → Méthode de génération de thread → Méthode d'exécution

from threading import Thread

#Fonction de rappel
def click_me(self):
    self.create_thread()

#Méthode de génération de thread
def create_thread(self):
    self.run_thread = Thread( target=self.method_in_a_thread )
    self.run_thread.start()
    print(self.run_thread)

#Méthode d'exécution
def method_in_a_thread(self):
    print('New Thread is Running.')
    self.get_youtube( self.URL_name.get(), self.Folder_name.get())

2.2.2. Appel

self.btn_Start = tk.Button(self.frame_form, text = 'Start')
self.btn_Start.configure( font= self.font02 )
self.btn_Start.grid( column=1, row=2, padx=20, pady=20, sticky= tk.W + tk.E )
self.btn_Start.configure( command = self.click_me)

3. Comment utiliser

Entrez l'URL de la vidéo Youtube à télécharger et spécifiez le dossier à télécharger. Appuyez ensuite sur le bouton Démarrer. Voici un exemple de la vidéo de M. Samurai, qui fait un bond en avant dans la vidéo de commentaire du drame NHK Taiga "Kirin ga Kuru". https://www.youtube.com/watch?v=NYUYYMs-5UY Après le téléchargement, il semble qu'il sera lu sur le lecteur. image.png

4. Résumé

  1. Utilisez un module appelé Pytube pour télécharger Youtube.
  2. Utilisez Tkinter pour créer une interface graphique.
  3. Introduit le multi-threading pour maintenir la réactivité de l'interface graphique.

5. Code

GUI_youtube.py


from pytube import YouTube
import tkinter as tk

from tkinter import Menu
from tkinter import messagebox as msg
from tkinter import font
from tkinter import filedialog

from tkinter import ttk
import os
from time import sleep
from threading import Thread

class Application(tk.Frame):
    def __init__(self,master):
        super().__init__(master)
        self.pack()

        self.master.geometry("800x500")
        self.master.title("Youtube Downloader")
        self.master.resizable(False, False)

        # ---------------------------------------
        # Favicon
        # ---------------------------------------
        self.iconfile = "./favicon.ico"
        self.master.iconbitmap(default=self.iconfile)
        self.create_widgets()



    def create_widgets(self):


        # ---------------------------------------
        # font
        # ---------------------------------------
        self.font01 = font.Font(family="Helvetica", size=15, weight="normal")
        self.font02 = font.Font(family='Helvetica', size=15, weight='bold')
        self.font03 = font.Font(family='Helvetica', size=30, weight='bold')

        # ---------------------------------------
        # Menu
        # ---------------------------------------
        self.menu_bar = Menu( self.master )
        self.master.config( menu=self.menu_bar )

        self.file_menu = Menu( self.menu_bar, tearoff=0 )
        self.file_menu.add_command( label='Exit', command=self._quit )
        self.menu_bar.add_cascade( label='File', menu=self.file_menu )



        # Add another help menu
        self.help_menu = Menu( self.menu_bar, tearoff=0 )
        self.help_menu.add_command( label='About', command=self._msgBox )  # Display messagebox when clicked
        self.menu_bar.add_cascade( label='Help', menu=self.help_menu )

        # ---------------------------------------
        # Main Label
        # ---------------------------------------
        self.lbl_main = ttk.Label(self.master, text = 'Youtube Downloader', font=self.font03)

        self.lbl_main.place(relx = 0.25, rely = 0.02)

        # ---------------------------------------
        # Frame : URL Input Form, Downloader Folder
        # ---------------------------------------
        self.frame_form = tk.Label(self.master)
        self.frame_form.place(relx = 0.01 , rely = 0.25, height = 400 , width= 780 )
        # ---------------------------------------
        # URL Input Form
        # ---------------------------------------

        self.lbl_URL = ttk.Label(self.frame_form, text = 'URL')
        self.lbl_URL.configure(font=self.font01)
        self.lbl_URL.grid(column=0, row=0, padx = 20, pady= 20)

        self.URL_name = tk.StringVar()

        self.ent_URL = ttk.Entry(self.frame_form, textvariable = self.URL_name)
        self.ent_URL.configure(width = 35, font= self.font01)
        self.ent_URL.grid(column=1, row=0, padx = 20, pady= 20)
        self.ent_URL.focus()


        # ---------------------------------------
        # Download Folder
        # ---------------------------------------

        self.Folder_name = tk.StringVar()

        self.lbl_folder = ttk.Label( self.frame_form, text='Download\n  Folder' )
        self.lbl_folder.configure( font=self.font01 )
        self.lbl_folder.grid( column=0, row=1, padx=20, pady=20 )

        self.ent_Folder = ttk.Entry(self.frame_form,textvariable = self.Folder_name)
        self.ent_Folder.configure(width =35,font= self.font01)
        self.ent_Folder.grid(column=1, row=1, padx=20, pady=20)


        self.btn_Folder = tk.Button( self.frame_form, text = 'Set Folder Path')
        self.btn_Folder.configure(font = self.font02)
        self.btn_Folder.grid(column=2, row=1, padx=20, pady=20, sticky=tk.W + tk.E )
        self.btn_Folder.configure( command= self._get_Folder_Path)



        # ---------------------------------------
        # Start Button
        # ---------------------------------------

        self.btn_Start = tk.Button(self.frame_form, text = 'Start')
        self.btn_Start.configure( font= self.font02 )
        self.btn_Start.grid( column=1, row=2, padx=20, pady=20, sticky= tk.W + tk.E )
        self.btn_Start.configure( command = self.click_me)
        #
        # ---------------------------------------
        # Progress Bar
        # ---------------------------------------

        self.progress_bar = ttk.Progressbar(self.frame_form, orient='horizontal', length=286, mode = 'determinate')
        self.progress_bar.grid(column=1, row=3, padx=20, pady=12,sticky=tk.W + tk.E)


    # ---------------------------------------
    # Create Callback Functions
    # ---------------------------------------

    #Python Treading to prevent GUI freezing.

    def click_me(self):
        self.create_thread()

    def create_thread(self):
        self.run_thread = Thread( target=self.method_in_a_thread )
        self.run_thread.start()
        print(self.run_thread)

    def method_in_a_thread(self):
        print('New Thread is Running.')
        self.get_youtube( self.URL_name.get(), self.Folder_name.get())


    # Display a Message Box
    def _msgBox(self):
        msg.showinfo('Program Information', 'Youtube Downloader with Tkinter \n (c) 2020 Tomomi Research Inc.')

    # Youtube Download Function
    def get_youtube(self, y_url, download_folder):

        #Youtube Instance
        yt = YouTube(y_url)
        yt.streams.filter(progressive=True ,subtype='mp4' ).get_highest_resolution().download( download_folder )

        #progress bar

        self.progress_bar["maximum"] = 100

        for i in range(101):
            sleep(0.05)
            self.progress_bar["value"]= i
            self.progress_bar.update()

    # Exit GUI cleanly
    def _quit(self):
        self.master.quit()
        self.master.destroy()
        exit()

    # Get Folder Path
    def _get_Folder_Path(self):
        iDir = os.path.abspath(os.path.dirname(__file__))
        folder_Path = filedialog.askdirectory(initialdir = iDir)

        self.Folder_name.set(folder_Path)

def main():
    root = tk.Tk()
    app = Application(master=root)#Inherit
    app.mainloop()

if __name__ == "__main__":
    main()


Matériel de référence

  1. Utilisons pytube
  2. Outil GUI (Python) qui télécharge des vidéos depuis YouTube 3.Threading in Tkinter python improve the performance

Recommended Posts

[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai fait un compteur de caractères avec Python
J'ai fait un jeu de puzzle (comme) avec Tkinter of Python
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
J'ai fait une prévision météo de type bot avec Python.
J'ai fait un jeu de cueillette avec Python
Made Mattermost Bot avec Python (+ Flask)
J'ai fait un blackjack avec du python!
J'ai fait un texte Python
J'ai fait un blackjack avec Python.
J'ai créé wordcloud avec Python.
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai créé une fenêtre pour la sortie du journal avec Tkinter
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
J'ai essayé de faire LINE BOT avec Python et Heroku
J'ai fait un programme de gestion de la paie en Python!
J'ai dessiné une carte thermique avec Seaborn [Python]
J'ai essayé un langage fonctionnel avec Python
Ce que j'ai fait avec les tableaux Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un générateur Hanko avec GAN
Après avoir étudié Python3, j'ai créé un Slackbot
J'ai fait une application WEB avec Django
Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)
J'ai fait un circuit simple avec Python (AND, OR, NOR, etc.)
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
J'ai créé un formulaire de tweet Nyanko avec Python, Flask et Heroku
J'ai créé beaucoup de fichiers pour la connexion RDP avec Python
[Python] J'ai créé une visionneuse d'images avec une fonction de tri simple.
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
J'ai créé un chat-holdem de serveur de jeu de poker en utilisant websocket avec python
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
J'ai fait un robot de remplacement de tampon avec une ligne
J'ai créé un fichier de dictionnaire python pour Neocomplete
〇✕ J'ai fait un jeu
J'ai créé un outil pour parcourir automatiquement plusieurs sites avec Selenium (Python)
Outil de rognage d'image GUI réalisé avec Python + Tkinter
Je veux faire un jeu avec Python
Procédure de création d'un LineBot réalisé avec Python
J'ai fait un simple portefeuille de Bitcoin avec pycoin
J'ai créé un téléchargeur pour l'expression distribuée par mot
J'ai créé un Bot LINE avec Serverless Framework!
J'ai créé un outil qui facilite un peu la décompression avec CLI (Python3)
J'ai fait un graphique de nombres aléatoires avec Numpy
Je veux écrire dans un fichier avec Python
J'ai créé un programme cryptographique César en Python.
Création du wrapper d'API Qiita Python "qiipy"
J'ai fait un module PyNanaco qui peut charger des crédits nanaco avec python
J'ai fait une application d'envoi de courrier simple avec tkinter de Python