我有以下代码
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
进度条没有实时更新...当循环结束时,进度条突然增加...
是否可以使用线程实时更新滚动条?
最佳答案
进度条直到最后才更新的原因是因为您将主线程与循环捆绑在一起。所有 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))
如果你的“sendmail”需要一段时间,它在工作时仍然会卡住 GUI。您可以将其放入后台线程中,但必须记住不要从后台线程修改 GUI 元素,因为 GUI 不是线程安全的。您可以再次使用Clock.schedule_once
来安排更新进度条的函数。
关于python - Python 和 Kivy 中带有线程的进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32350350/