如何在kivy中制作循环进度条?

时间:2018-05-26 12:56:51

标签: python progress-bar kivy kivy-language

我想用kivy和python创建一个简单的循环进度条。我搜索了在线文档和GitHub曲目,但没有找到解释循环进度条概念的单个正确示例。

如下图所示。我想要发展。请有人帮我解决这个问题。 enter image description here

1 个答案:

答案 0 :(得分:7)

我制作了一个小部件来表示你想要实现的目标。但是,确实有一些限制:

  1. 您需要调用.value方法,而不是仅使用set_value设置进​​度条值。我不确定应该采取什么措施来实现与原始ProgressBar类相同的行为;

  2. 您必须指定实现圆的大小,因为对象本身是一个椭圆。

  3. 以下是代码,也是示例用法:

    from kivy.app import App
    from kivy.uix.progressbar import ProgressBar
    from kivy.core.text import Label as CoreLabel
    from kivy.lang.builder import Builder
    from kivy.graphics import Color, Ellipse, Rectangle
    from kivy.clock import Clock
    
    
    class CircularProgressBar(ProgressBar):
    
        def __init__(self, **kwargs):
            super(CircularProgressBar, self).__init__(**kwargs)
    
            # Set constant for the bar thickness
            self.thickness = 40
    
            # Create a direct text representation
            self.label = CoreLabel(text="0%", font_size=self.thickness)
    
            # Initialise the texture_size variable
            self.texture_size = None
    
            # Refresh the text
            self.refresh_text()
    
            # Redraw on innit
            self.draw()
    
        def draw(self):
    
            with self.canvas:
    
                # Empty canvas instructions
                self.canvas.clear()
    
                # Draw no-progress circle
                Color(0.26, 0.26, 0.26)
                Ellipse(pos=self.pos, size=self.size)
    
                # Draw progress circle, small hack if there is no progress (angle_end = 0 results in full progress)
                Color(1, 0, 0)
                Ellipse(pos=self.pos, size=self.size,
                        angle_end=(0.001 if self.value_normalized == 0 else self.value_normalized*360))
    
                # Draw the inner circle (colour should be equal to the background)
                Color(0, 0, 0)
                Ellipse(pos=(self.pos[0] + self.thickness / 2, self.pos[1] + self.thickness / 2),
                        size=(self.size[0] - self.thickness, self.size[1] - self.thickness))
    
                # Center and draw the progress text
                Color(1, 1, 1, 1)
                Rectangle(texture=self.label.texture, size=self.texture_size,
                          pos=(self.size[0]/2 - self.texture_size[0]/2, self.size[1]/2 - self.texture_size[1]/2))
    
        def refresh_text(self):
            # Render the label
            self.label.refresh()
    
            # Set the texture size each refresh
            self.texture_size = list(self.label.texture.size)
    
        def set_value(self, value):
            # Update the progress bar value
            self.value = value
    
            # Update textual value and refresh the texture
            self.label.text = str(int(self.value_normalized*100)) + "%"
            self.refresh_text()
    
            # Draw all the elements
            self.draw()
    
    
    class Main(App):
    
        # Simple animation to show the circular progress bar in action
        def animate(self, dt):
            if self.root.value < 80:
                self.root.set_value(self.root.value + 1)
            else:
                self.root.set_value(0)
    
        # Simple layout for easy example
        def build(self):
            container = Builder.load_string(
                '''CircularProgressBar:
        size_hint: (None, None)
        height: 200
        width: 200
        max: 80''')
    
            # Animate the progress bar
            Clock.schedule_interval(self.animate, 0.1)
            return container
    
    
    if __name__ == '__main__':
        Main().run()
    

    输出:

    Animated circular progress bar