Kivy Progress-Bar не будет обновляться до 100% завершения - PullRequest
0 голосов
/ 14 мая 2019

Индикатор прогресса Kivy обновляется графически только после того, как функция, которая обновляет свои внутренние значения, полностью завершена (завершение 100%). Я использую его для обновления базы данных имен и значений и хочу, чтобы он отображал ход обновления.

Что касается других подобных проблем, все нижеперечисленные методы были опробованы и потерпели неудачу:

(Clock.schedule_interval,Clock.schedule_once,Clock.create_trigger,@mainthread,Clock.schedule_once(partial(func))

Их остатки можно увидеть в закомментированных разделах ниже

На другой странице есть кнопка, которую я нажимаю, которая вызывает update_database (). update_database вызывает updateLoadingScreen, чтобы изменить значения на индикаторе выполнения и метке числа выполненных процентов. В изоляции, кажется, эта функция работает. Однако запуск его в update_database () приводит к зависанию обновлений пользовательского интерфейса до тех пор, пока он просто не выдаст 100% завершения. Clock.schedule_interval делает паузу, пока не будет достигнут 100%, как внутри, так и снаружи функции update_database, Clock.schedule_once также ждет, пока не будет достигнут 100%, прежде чем что-либо делать. Clock.create_trigger, по-видимому, не вызывает ничего, кроме случаев, когда это создается. Функция partctools () не меняет поведения. @mainthread выдает ошибку: «mainthread» не определен.

Похоже, это не проблема синхронизации, поскольку 0,2 секунды достаточно для обновления значений в других ситуациях. Тем не менее, он действительно заблокирован в процессе и не может обновить пользовательский интерфейс, даже если параметры пользовательского интерфейса изменены.

from kivy.uix.label import Label
from kivy.uix.progressbar import ProgressBar
from functools import partial


class UpdatePage(GridLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        #This part puts the series into a pandas dataframe
        self.df=getAllSeries()
        self.allserieslen=len(self.df)

        self.progress_bar=ProgressBar(max=self.allserieslen-1,value=0)
        self.add_widget(self.progress_bar)

        self.progress_label=Label(text='0%')
        self.add_widget(self.progress_label)

        #self.update_progress_trigger = Clock.create_trigger(self.updateLoadingScreen(self.currentseries,self.serieslen),-1)


        #Clock.schedule_interval(lambda x:self.updateLoadingScreen(self.currentseries,self.serieslen),.2)
        #This works, in a vaccum



    def update_database(self):
        #screenupdate=Clock.schedule_interval(lambda x:self.updateLoadingScreen(self.currentseries,self.serieslen),.2)
        for rownum in range(self.serieslen):
            chapters,name=findSingleSeriesChapter(self.df.at[rownum, 'URL'])
            self.currentseries=rownum

            #failed ways to update the screen (including the schedule and unscedule above and below)
            self.updateLoadingScreen(self.currentseries,self.serieslen)
            #Clock.schedule_once(lambda x:self.updateLoadingScreen(self.currentseries,self.serieslen),0.2)
            #self.update_progress_trigger()
            #Clock.schedule_once(lambda x:partial(self.updateLoadingScreen(self.currentseries,self.serieslen)),0.2)
            print('loop done',self.currentseries)
        #Clock.unschedule(screenupdate)

    #@mainthread
    def updateLoadingScreen(self,rownum,serieslen):
        print("Event has been triggered")
        self.progress_bar.value=rownum
        #self.remove_widget(self.progress_bar)
        #self.add_widget(self.progress_bar)
        percentage=str(round((rownum)/(serieslen-1)*100,1))

        self.progress_label.text=f"{percentage}%"
        #self.remove_widget(self.progress_label)
        #self.add_widget(self.progress_label)

1 Ответ

0 голосов
/ 15 мая 2019

Код Kivy, который обновляет пользовательский интерфейс, должен запускаться в mainthread, иначе приложение «зависает», пока не будет выполнено текущее действие. Попробуйте добавить декоратор @mainthread к своему штрих-коду

from kivy.clock import mainthread

...