Kivy的进度条只在更新其内部值的函数完全完成(100%完成)后才以图形方式更新。我用它来更新一个名称和值的数据库,并希望它显示更新的进度。你知道吗
针对其他类似问题,以下方法均已尝试但均失败:
(Clock.schedule_interval,Clock.schedule_once,Clock.create_trigger,@mainthread,Clock.schedule_once(partial(func))
它们的残余可以在下面注释掉的部分中看到
我在另一个页面上按了一个按钮,触发update\ u database()。update\u database调用updateLoadingScreen来更改进度条和数字完成百分比标签上的值。单独来看,这个函数似乎可以工作。但是,在update\u database()中运行它会导致UI更新冻结,直到它只输出100%的完成。时钟.u间隔暂停,直到达到100%,无论是在内部还是外部更新\u数据库函数,Clock.schedule\u一次也要等到达到100%后再做任何事情。Clock.create\u触发器似乎不调用任何东西,除非它被实例化。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 decorator添加到进度条形码中
from kivy.clock import mainthread
相关问题 更多 >
编程相关推荐