首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Kivy Progress-栏只有在100%完成后才会更新

Kivy Progress-栏只有在100%完成后才会更新
EN

Stack Overflow用户
提问于 2019-05-15 03:36:12
回答 1查看 405关注 0票数 0

Kivy的进度条只有在更新其内部值的函数完全完成(100%完成)后才会以图形方式更新。我正在使用它来更新名称和值的数据库,并希望它能显示更新的进度。

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

代码语言:javascript
复制
(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%,然后再执行任何操作。Clock.create_trigger似乎不调用任何东西,除非它是实例化的。Functools partial()不改变任何行为。@mainthread给出错误:‘mainthread’未定义。

这似乎不是一个时间问题,因为0.2秒足以让它在其他情况下更新值。但是,它看起来确实被锁定在进程中,无法更新UI,即使UI参数已修改。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2019-05-15 07:47:21

更新UI的Kivy代码应该在主线程上运行,否则应用程序将“冻结”,直到当前运行的操作完成。尝试将@mainthread装饰器添加到进度条形码中

from kivy.clock import mainthread

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56137454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档