我有以下代码
main.py
class ExampleRoot(BoxLayout):
def any(self,*args):
x=0
while x<10:
server.sendmail(c,g,e)
total_emails="activity done"
#### progressbar not updating in live time
self.ids["pb"].value+=1
from jnius import autoclass
PythonActivity = autoclass('org.renpy.android.PythonActivity')
PythonActivity.toastError(total_emails)
x+=1
这是我的kv文件
<ExampleRoot>:
ProgressBar:
id:pb
max:10
value:0
进度条没有实时更新...当循环结束时突然增加进度条....
是否可以使用线程实时更新滚动条?
答案 0 :(得分:3)
您的进度条直到最后才更新的原因是因为您将MainThread与循环绑定在一起。所有Kivy GUI更新都是从主线程完成的,因此如果您阻止它,GUI中的任何内容都不会更新。
你可以解决这两种方式。如果你的循环内容执行得很快,你可以使用Kivy的Clock对象来运行你的函数而不是循环:
def any(self, x, *args):
server.sendmail(c,g,e)
total_emails="activity done"
self.ids["pb"].value+=1
from jnius import autoclass
PythonActivity = autoclass('org.renpy.android.PythonActivity')
PythonActivity.toastError(total_emails)
x+=1
if x < 10:
Clock.schedule_once(lambda dt: self.any(x))
如果您的&#34; sendmail&#34;需要一段时间,它仍然会在GUI工作时冻结GUI。您可以将它放在后台线程中,但是您必须记住不要从后台线程修改GUI元素,因为GUI不是线程安全的。您可以再次使用Clock.schedule_once
来安排更新进度条的功能。