我正在做一个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进行任何更新。这是一个常见问题,通常通过在单独的线程中运行长时间运行的方法来处理。见threading documentation。然后,从该方法内部使用Clock.schedule_once()调度更新主线程上GUI的调用相关问题 更多 >
编程相关推荐