Python 如何更新kivy上的布局?

Python 如何更新kivy上的布局?,python,python-3.x,kivy,Python,Python 3.x,Kivy,我正在做一个YouTube转换器。没关系,但当我下载并转换时,我想让用户知道我正在工作:我如何更新我的界面?我用的是kivy。我试着用一个弹出窗口,我试着用各种各样的加载条。现在我试图更新主界面中一个框中的文本,但什么也没有,它在转换后会更新。为什么? 这是我的密码: from kivy.app import App from kivy.uix.floatlayout import FloatLayout from kivy.uix.label import Label from kivy.ui

我正在做一个YouTube转换器。没关系,但当我下载并转换时,我想让用户知道我正在工作:我如何更新我的界面?我用的是kivy。我试着用一个弹出窗口,我试着用各种各样的加载条。现在我试图更新主界面中一个框中的文本,但什么也没有,它在转换后会更新。为什么? 这是我的密码:

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.popup import Popup


from pydub import AudioSegment
from pytube import YouTube
import os
import time

class YouTube2mp3App(App):
    
        
    def build(self):

        self.mylayout = FloatLayout()
        mylabel = Label(text= "Benvenuto su YouTube2mp3!\nInserisci il link e premi converti", size_hint=(.8,.2),pos_hint={"x":.1, "y":.7}, font_size=20)
        self.txt = TextInput(hint_text="Incolla qui",size_hint=(.9,.1), pos_hint={"x":.05, "y":.4})
        self.pb = Label(text="0%", size_hint=(.9,.2), pos_hint={"x":.1, "y":.1}, font_size=20)
        #self.txt.bind(on_text_validate=self.convert)
        mybutton =Button(text="Nuovo/i video", on_press= self.clearText,size_hint=(.45,.1), pos_hint={"x":.5, "y":.3})  
        mybutton2 =Button(text="Converti", on_press= self.convert,size_hint=(.45,.1), pos_hint={"x":.05, "y":.3}) 
        self.mylayout.add_widget(mylabel)
        self.mylayout.add_widget(self.txt)
        self.mylayout.add_widget(self.pb)
        self.mylayout.add_widget(mybutton)
        self.mylayout.add_widget(mybutton2)
        return self.mylayout

    def clearText(self, instance):
        #clear input
        self.txt.text = ''

    def convert(self, instance):
        try:

        #starting to convert using 3 methods    
            self.pb.text="Preparazione... 10%"
            self.mylayout.add_widget(self.pb)
            ns=self.check_spazio(self.txt.text)
            
            self.pb.text="Conversione... 33%"
            self.mylayout.add_widget(self.pb)
            print(ns)
            links=self.list_of_links(ns)
            
            self.pb.text="Scaricamento... 80%"
            self.mylayout.add_widget(self.pb)
            print(links)
            
            self.Tube(links)
            
            self.pb.text="Fatto!... 100%"
            self.mylayout.add_widget(self.pb)
            content = Button(text='Chiudi', size_hint=(.3,.7))
            popup = Popup(title="Fatto!", content=content, auto_dismiss=False, size_hint=(.3,.2))
            
            content.bind(on_press=popup.dismiss)
            popup.open()
            self.pb.value="0%"
        except:
            content = Button(text='Chiudi', size_hint=(.3,.7))
            popup = Popup(title="Link non valido", content=content, auto_dismiss=False, size_hint=(.3,.2))
            content.bind(on_press=popup.dismiss)
            popup.open()

    def Tube(self, lista):
        #convert
        for text in lista:
            yt=YouTube(text)
            ys=yt.streams.get_audio_only()

            file=ys.download()
            ya=file[:-1]+"3"
            AudioSegment.from_file(file).export(ya, format="mp3")
            os.remove(file)

    def check_spazio(self, string):
        #check space between input string 
        s=list(string)
        strig=[]
        for i in s:
            if i!=" ":
                strig.append(i) 
        string = "".join(strig)
        return string

    def list_of_links(self, string):
        #create a list of strings. Each string is a link
        prev=0
        links=[]
        for i in range (len(string)):
            if string[i]=="\n" or string[i]==",":
                links.append(string[prev:i])
                prev=i+1
            elif i==len(string)-1:
                links.append(string[prev:i+1])
        return links

YouTube2mp3App().run()


当您在主线程上运行一个方法时,就像使用
convert()
方法一样,在该方法返回之前,不会对GUI进行任何更新。这是一个常见问题,通常通过在单独的线程中运行长时间运行的方法来处理。看。然后,从该方法内部使用调度调用来更新主线程上的GUI