在Python和Kivy中使用线程的ProgressBar

时间:2015-09-02 10:10:06

标签: python multithreading kivy

我有以下代码

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

进度条没有实时更新...当循环结束时突然增加进度条....

是否可以使用线程实时更新滚动条?

1 个答案:

答案 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来安排更新进度条的功能。