python - Python 和 Kivy 中带有线程的进度条

标签 python multithreading kivy

我有以下代码

ma​​in.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/

相关文章:

java - 房间同步 : How to ensure multiple threads are using same node?

python - Kivy 未显示在 Raspberry Pi 3 上运行的 Window

python - 尝试更改 Kivy 中的标签文本,但它永远不会改变

python - 如何有效地将 tsv 文件中的数组列读取到每个列的单个 npz 文件中?

Python ? (条件/三元)赋值运算符

python - Django 应用程序在 Heroku 中崩溃

java - 如何防止java中同步代码中的happens-before?

java - 避免 Iterator ConcurrentModificationException 的方法

python - 文本输入的 Kivy 错误

python:替换字符串中的特殊字符