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

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

>不是仅使用.value设置进度条值,而是需要调用set_value方法.我不确定应该采取什么措施来实现与原始ProgressBar类相同的行为;
>您必须指定实现圆的大小,因为对象本身是一个椭圆.

``````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):
'''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()
``````

本文转自网络文章，转载此文章仅为分享知识，如有侵权，请联系博主进行删除。