Kivy Progress-bar直到100%完成后才会更新



kivy的进度栏仅一旦更新其内部值的功能就完全完成了图形更新(100%完成(。我正在使用它来更新名称和值的数据库,并希望它显示更新的进度。

根据其他类似问题,所有以下方法都已尝试并失败:

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

可以在下面的评论部分中看到它们的残余

另一个页面上有一个按钮,我按了触发update_database((的按钮。update_database调用updateLoadingsCreen,以更改完成数值百分比的标签上的值。孤立地,此功能似乎有效。但是,在update_database((中运行它会导致UI更新冻结,直到它仅输出100%完成为止。clock.schedule_interval暂停,直到在内部和外部到达100%,直到update_database函数,clock.schedule_once也要等到100%达到100%。Clock.Create_trigger似乎没有任何呼叫,除非它实例化。functools partial((不会改变任何行为。@mainthread给出错误:未定义'mainthread'。

这似乎不是时间问题,因为0.2秒足以使其在其他情况下更新值。但是,即使修改了UI参数,它确实确实被锁定在过程中,并且无法更新UI。

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)

更新UI的Kivy代码应在Mainthread上运行,否则应用程序"冻结",直到完成当前的运行操作为止。尝试将@mainthread Decorator添加到您的进度条形码

from kivy.clock import mainthread

最新更新