【问题标题】:ProgressBar with Threading in Python and Kivy在 Python 和 Kivy 中使用线程的 ProgressBar
【发布时间】:2016-07-05 17:53:21
【问题描述】:

我有以下代码

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

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

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

【问题讨论】:

    标签: python multithreading kivy


    【解决方案1】:

    您的进度条直到最后才更新的原因是因为您将 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))
    

    如果您的“发送邮件”需要一段时间,它在工作时仍会冻结 GUI。您可以将其放在后台线程中,但您必须记住不要从后台线程修改 GUI 元素,因为 GUI 不是线程安全的。您可以再次使用Clock.schedule_once 来安排更新进度条的功能。

    【讨论】:

    • @bjo 我不明白 lambda 的用法
    • 只是给你一个想法。由于您没有包含可以执行的完整示例,因此我无法运行它。你是什​​么意思“它不工作”?我使用 lambda 是因为 schedule_once 函数不向函数传递参数,您可以使用 lambda 或使用 functools.partial,这在链接的时钟文档中有所描述。
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多