Индикатор выполнения в KIVY не может обновляться с помощью цикла - PullRequest
0 голосов
/ 05 сентября 2018

я собираюсь сделать индикатор выполнения в 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()

заранее спасибо

1 Ответ

0 голосов
/ 05 сентября 2018

Используйте 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...