当前位置: 首页 > 知识库问答 >
问题:

Kivy进度条值更新,但进度条不

方苗宣
2023-03-14

我的kivy应用程序中有一个ProgressBar。我相信我需要使用时钟。创建_触发器,以确保从循环内部更新进度条。

以下代码是用于再现性目的的淡化版本。

ProgressBar类

from kivy.clock import Clock
from kivy.uix.progressbar import ProgressBar


class MyProgressBar(ProgressBar):
    def __init__(self, *args, **kwargs):
        super(MyProgressBar, self).__init__(*args, **kwargs)
        # self.update_bar_trigger = Clock.create_trigger(self.update_bar)
        self.update_bar_trigger = Clock.create_trigger(lambda dt: self.update_bar(), 1)

    def update_bar(self, step):
        if self.value <= 100:
            self.value += step
            self.update_bar_trigger()

主要类别:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.core.window import Window
from kivy.properties import ObjectProperty
from MyProgressBar import MyProgressBar

from kivy.lang import Builder
Builder.load_file('style.kv')


class Main_app(BoxLayout):
    # Progress bars
    loading_pb = MyProgressBar()

    def dummy(self):
        pb_increment = 10

        for i in range(10):
            time.sleep(2)
            self.loading_pb.update_bar(pb_increment)
            print(self.loading_pb.value)


class Stacked(App):
    def build(self):
        Window.clearcolor = (1, 1, 1, 1)
        Window.size = (1000, 700)

        return Main_app()

if __name__ == '__main__':
    Stacked().run()

KV文件

<Main_app>:
    loading_pb: load_pb

    GridLayout:
        rows: 2
        MyProgressBar:
            id: load_pb
            value: 0
            min: 0
            max: 100

        Button:
            text: 'Start Progress Bar'
            on_press:
                root.dummy()

此示例显示loading_pb.value按钮单击后代码循环时发生的变化。

进步吧。价值印刷输出

10.0
20.0
30.0
40.0
50.0
60.0
70.0
80.0
90.0
100.0

问题进度条的值似乎确实如预期的那样递增,但实际进度条直到循环结束时才立即改变。

相关的

  • 无法更新kivy进度条
  • kivy中的进度条无法使用循环更新
  • Kivy如何使用progressbar创建时间计数器
  • 如何在kivy python中使用带有多线程的时钟对象更新progressbar

共有1个答案

微生耘豪
2023-03-14
    for i in range(10):
        time.sleep(2)
        self.loading_pb.update_bar(pb_increment)
        print(self.loading_pb.value)

这段代码会阻塞gui,直到它返回,因此正常的gui绘图都不会发生。相反,使用时钟。安排时间间隔和/或时钟。计划_一次以计划循环的每个迭代。它们将函数调用插入kivy自己的eventloop,并避免阻塞该循环。

 类似资料:
  • 我在Android上用RxJava更新ProgressBar的进度有问题我想在延迟500毫秒后更新1%(从0%- 下面是我的代码:

  • 使用一些额外的类和一些巧妙的浏览器特有的 CSS,样式化 HTML5 的<progress> 元素。确保你阅读了浏览器支持。 <progress class="progress" value="0" max="100">0%</progress> <progress class="progress" value="25" max="100">25%</progress> <progress c

  • 进度条 <div class="ui-progress"> <span style="width:50%"></span> </div> 图片上进度条 <ul class="ui-grid-halve"> <li> <div class="ui-grid-halve-img"> <span style="background-ima

  • 本食谱演示了动态进度条的创建、模拟多个请求的管理,并在每个请求完成后更新总体进度。 示例代码 ( StackBlitz ) import './style.css'; import { Observable, of, empty, fromEvent, from } from 'rxjs'; import { delay, switchMapTo, concatAll, coun

  • 进度条(Progress Bars)是一个 HTML5 增量游戏,有一个有趣的进度条和资源管理。很有趣的一款放置游戏~

  • 问题内容: 我想让我的用户了解I / O操作的进度。目前,我有一个内部类,在开始I / O之前要开始学习,在完成后停止。看起来像这样: 是我对UI的引用,是我的外部类中的一个字段,表示我们在I / O中取得的进步。我将停止时的进度设置为100%,因为有时I / O完成并停止我的更新程序,然后它才能完成更新以前的增量。那只是确保它是100%。 目前,这可行,我像这样使用它: 问题在于循环严重地吞噬了