首页 > 解决方案 > kivy中的进度条无法使用循环更新

问题描述

我准备在 kivy 中做一个进度条,我可以用它构建应用程序,但是当我运行一个函数(循环)时它不能被更新,请问我该怎么做?

这是我的代码:导入库:

from kivy.app import App

from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout

from kivy.uix.label import Label
from kivy.properties import ObjectProperty
from kivy.core.window import Window
from kivy.clock import Clock
from kivy.logger import Logger
from kivy.uix.progressbar import ProgressBar

我的建设者:

Builder.load_string("""
<RootWidget>:
    pb : pb
    some code here
        ActionView:       
            ActionPrevious:
                with_previous: False 
                ActionButton:
                    text: 'Run analysis'
                    color: 29/255, 185/255, 84/255, 1
                    on_release: root.clicked()
    BoxLayout:
        ProgressBar:
            id : pb
            min :0
            max :1
            pos_hint: {'x': .1}
            size_hint_x :.8
            size_hint_y :.5
            value: 0
        """)

我的 update_bar 函数的其他代码:

class Myapp(BoxLayout):

    pb = ProgressBar()
    box = ObjectProperty()

    def __init__(self, *args, **kwargs):
        super(Myapp, self).__init__(*args, **kwargs)

    def update_bar(self,dt=None):
         self.ids.pb.value = self.ids.pb.value

这是问题所在:进度条不会在每次迭代中更新,而是取最后一个值(对于 i = 9999)

     def clicked(self):
        for i in range(10000) :
            self.ids.pb.value =  i/10000 
            Clock.schedule_interval(self.update_bar,0.5)
            self.update_bar()

构建我的应用程序:

class EventScreen(App,Myapp):
    def on_stop(self):
        Logger.critical("Good bye")
    def build(self):
        return Myapp()
if __name__ == "__main__":
    EventScreen().run()

先感谢您

标签: kivy

解决方案


使用Clock.create_trigger()更新进度条。

片段

 def __init__(self, *args, **kwargs):
    super(Myapp, self).__init__(*args, **kwargs)
    self.update_bar_trigger = Clock.create_trigger(self.update_bar)

 def clicked(self):
    self.i = 0
    self.update_bar_trigger()

def update_bar(self, dt):
    if self.i <= 10000:
        self.ids.pb.value += self.i
        self.i += 1
        self.update_bar_trigger()

推荐阅读