Search code examples
pythonkivykivy-languagepytube

Why kivy doesn't write to TextArea


i tried different solutions, but no one works. This is my last attempt.

When the script join in the first try print in console "porco" but doesn't write in the text.result Label, why??? It skip directly to the last Label write for download accomplished

import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from pytube import YouTube

class InputLink(GridLayout):
    def __init__(self, **kwargs):
        super(InputLink, self).__init__(**kwargs)
        self.rows = 4

        self.add_widget(Label(text="Link Youtube:"))
        self.link = TextInput(multiline=False)
        self.add_widget(self.link)

        self.result = Label(text="testo")
        self.add_widget(self.result)

        self.bottone1 = Button(text="Download")
        self.bottone1.bind(on_press=self.click1)
        self.add_widget(self.bottone1)

    def click1(self,btn):
        self.result.text = self.link.text
        yt = ""
        #print(yt.streams.filter(only_audio=True).all())
        try:
            yt = YouTube(self.link.text)
            self.result.text = "Avvio il download di "+self.link.text#<--WHY??
            print('porco')
        except Exception as e:
            self.result.text = "Errore 1"+str(e)
            return
        self.download(yt)
    def download(self,yt):
        try:
            yt.streams.filter(subtype='mp4').first().download()
            self.result.text = "Download completato!"
        except Exception as e:
            self.result.text = "Errore 2"+str(e)



class YoutubeApp(App):
    def build(self):
        return InputLink()
if __name__ == "__main__":
    YoutubeApp().run()

Solution

  • It did not display the updated text because it is downloading in the same frame.

    Solution

    1. Replace all occurrence of yt with self.yt
    2. Replace self.download(yt) with Clock.schedule_once(self.download, 1)
    3. Replace download(self, yt) method with download(self, dt)

    Snippet

    def click1(self, btn):
        self.result.text = self.link.text
        self.yt = ""
        # print(yt.streams.filter(only_audio=True).all())
        try:
            self.yt = YouTube(self.link.text)
            self.result.text = "Avvio il download di " + self.link.text  # <--WHY??
            print('porco')
        except Exception as e:
            self.result.text = "Errore 1" + str(e)
            return
        Clock.schedule_once(self.download, 1)
    
    def download(self, dt):
        try:
            self.yt.streams.filter(subtype='mp4').first().download()
            self.result.text = "Download completato!"
        except Exception as e:
            self.result.text = "Errore 2" + str(e)
    

    Output

    Img01 - Downloading Img02 - Download completed