下载Kivy的进度条

时间:2017-06-30 18:21:58

标签: python kivy python-3.4 urllib

我正在尝试构建一个下载文件的应用,可以在kivy应用上跟踪其进度。

我查看了示例herehere以了解下载进度。 这是我的代码:

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()

但是,我很困惑如何将download_file函数与kivy小部件功能绑定,以使其工作。如何正确修改打印功能以使其与窗口小部件一起使用

1 个答案:

答案 0 :(得分:0)

如果你在mainthread中阻塞kivy,则无法再更新GUI。而是创建一个新线程并使用@mainthread annotation进行gui更新。

而不是打印,你必须操纵kivy小部件。您可以创建一个矩形并将宽度增加到100%。您可以创建textinput并在那里输出文本。