kivy:带进度条的弹出窗口

1 投票
1 回答
2380 浏览
提问于 2025-04-18 15:28

有没有办法创建一个带有“移动”进度条的弹出窗口?

这是我尝试过的一个例子,但它只会在循环完成后才显示弹出窗口。我希望在执行的过程中就能看到它。

import time

from kivy.app import App

from kivy.uix.button import Button
from kivy.uix.progressbar import ProgressBar
from kivy.uix.popup import Popup

databases = range(5)

class testApp(App):

    def launch_popup(self, instance):
        print("Button pressed for popup: {0}".format(instance))
        import time 

        pb = ProgressBar() #100
        popup = Popup(title='Syncing Databases', content=pb, size_hint=(0.7, 0.3))
        popup.open()

        for i in databases:
            time.sleep(1) #simulate syncing database
            pb.value += 100/len(databases)
            print("Progressbar is on {0}%".format(pb.value))


    def build(self):
        btn = Button(text="Popup", on_press=self.launch_popup)
        return btn


testApp().run()

或者我应该使用线程或者自定义的控件,如果是这样的话,我该怎么实现呢?

非常感谢!

1 个回答

2

你的问题在于,for循环不仅会阻塞弹出窗口,还会阻塞你应用里的所有其他内容——因为它和kivy的事件循环在同一个线程里运行,所以在for循环完成之前,kivy根本无法做任何事情。

你应该把for循环放在一个单独的线程里运行,或者把它拆分成更小的部分,这样可以用Clock.schedule_once或Clock.schedule_interval来安排执行。这样一来,kivy就可以在运行你代码的同时,继续执行它正常的任务。

撰写回答