2017-06-30 7 views
1

Ich versuche eine App zu erstellen, die eine Datei herunterlädt, deren Fortschritt in einer kivy App verfolgt werden kann.Download Fortschrittsbalken in Kivy

Ich habe mir das Beispiel here und here für den Download-Fortschritt angesehen. Dies ist mein Code:

from kivy.app import App 
from kivy.uix.button import Button 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.label import Label 
from kivy.uix.textinput import TextInput 
from kivy.uix.popup import Popup 
from kivy.factory import Factory 
from kivy.properties import ObjectProperty 
from kivy.clock import Clock 
import urllib 

URL = "http://s9.videozoo.me/S/saenai_heroine_no_sodatekata_flat_-_11.mp4?st=Ow7pwXbRt6vPWE-kr5Sn1A&e=1498847899&start=0" 

class PopupBox(Popup): 
    pop_up_text = ObjectProperty() 

    def update_pop_up_text(self, p_message): 
     self.pop_up_text.text = p_message 


class MyApp(App): 
    # layout 
    def show_popup(self): 
     self.pop_up = Factory.PopupBox() 
     self.pop_up.update_pop_up_text('Running some task...') 
     self.pop_up.open() 

    def build(self): 
     layout = BoxLayout(padding=10, orientation='vertical') 
     btn1 = Button(text="OK") 
     btn1.bind(on_press=self.buttonClicked) 
     layout.add_widget(btn1) 
     self.lbl1 = Label(text="test") 
     layout.add_widget(self.lbl1) 
     self.txt1 = TextInput(text='', multiline=False) 
     layout.add_widget(self.txt1) 
     return layout 

    # button click function 
    def buttonClicked(self, btn): 
     self.lbl1.text = "You wrote " + self.txt1.text 
     self.show_popup() 

     self.download_file(URL) 
     self.pop_up.dismiss() 

    def download_file(self, url): 
     u = urllib.request.urlopen(url) 
     meta = u.info() 
     metaInfo = str(meta).split() 
     fileTotalbytes = int(metaInfo[46]) 

     data_blocks = [] 
     total = 0 

     while True: 
      block = u.read(1024) 
      data_blocks.append(block) 
      total += len(block) 
      hash = ((60 * total) // fileTotalbytes) 
      print("[{}{}] {}%".format('#' * hash, ' ' * (60 - hash), int(total/fileTotalbytes * 100)), end="\r") 

      if not len(block): 
       break 
      data = b''.join(data_blocks) # had to add b because I was joining bytes not strings 
     u.close() 

# run app 
if __name__ == "__main__": 
    MyApp().run() 

Aber ich bin verwirrt, wie kann ich binden die download_file Funktion mit der Funktionalität Kivy Widget so, wie es funktioniert. Wie kann ich die Druckfunktion so anpassen, dass sie mit dem Widget funktioniert?

Antwort

0

Wenn Sie den Haupt-Thread blockieren, kann kivy die GUI nicht mehr aktualisieren. Erstellen Sie stattdessen einen neuen Thread und verwenden Sie die @mainthread annotation, um GUI-Updates durchzuführen.

Anstelle des Drucks müssen Sie kivy Widgets manipulieren. Sie könnten ein Rechteck erstellen und die Breite auf 100% erhöhen. Sie könnten einen Textinput erstellen und Ihren Text dort ausgeben.