Я задал вопрос о создании индикатора выполнения с использованием stencilview здесь
И я мог бы успешно его создать.
Теперь я пытаюсь сделать частичное отображениеотображение изображения, как показано ниже
- Первое отображение фонового изображения.
- Постепенное отображениеопределенная часть заполненного изображения.
- Например, заполните руку, затем заполните ногу.
- В этом случае я пытаюсь заполнить в зависимости от того, какой параметр руки и ноги вставлен.
Я думаю, что, может быть, я должен изобразить изображения как 5 частей и иметь шаблон для каждой из них, но я спрашиваю, есть ли способ сделать это, не добавляя 5 разных изображений и шаблонов.
Вот то, что я сейчас сделал для одного изображения прогресса.
from kivy.app import App
from kivy.properties import StringProperty, NumericProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.lang.builder import Builder
from kivy.clock import Clock
class CLS_PROGRESS_IMAGE(FloatLayout):
background = StringProperty(None)
progress_image = StringProperty(None)
max = NumericProperty(0.0)
def __init__(self, font_size=20, **kwargs):
super(CLS_PROGRESS_IMAGE, self).__init__(**kwargs)
self.progress_event = None
self.font_size = font_size
self.firstDraw = True
self.pbi = None
self.rect = None
self.bgi = None
self.value = 0.0
self.value_normalized = 0.0
self.horizontal = False
self.looping = True
self.progress_event = Clock.schedule_interval(self._progress, 0.1)
def draw(self):
if self.firstDraw:
self.ids.bgi.source=self.background
self.ids.pbi.source = self.progress_image
self.ids.lab.font_size = self.font_size
self.ids.lab.text = str(int(self.value_normalized*100)) + "%"
self.ids.sten.pos = self.pos
if self.horizontal is True:
self.ids.sten.width = self.size[0]*self.value_normalized
self.ids.sten.height = self.size[1]
else:
self.ids.sten.height= self.size[1]*self.value_normalized
self.ids.sten.width = self.size[0]
self.firstDraw = False
else:
self.ids.sten.pos = self.pos
self.ids.lab.text = str(int(self.value_normalized*100)) + "%"
if self.horizontal is True:
self.ids.sten.width = self.size[0]*self.value_normalized
else:
self.ids.sten.height= self.size[1]*self.value_normalized
def set_value(self, value):
self.value = value
self.value_normalized = self.value / self.max
self.draw()
def _progress(self, dt):
if self.value < self.max - 1:
self.set_value(self.value + 1)
else:
if self.looping:
self.value = 0
self.set_value(self.value)
else:
self.set_value(self.max)
self.progress_event.cancel()
# Demo
class DemoApp(App):
def build(self):
kv = Builder.load_string('''
<CLS_PROGRESS_IMAGE>:
Image:
id: bgi
allow_stretch: True
keep_ratio: False
StencilView:
id: sten
horizontal: False
size_hint: (None, None)
size: (0, root.height) if self.horizontal else (root.width, 0)
Image:
id: pbi
allow_stretch: True
keep_ratio: False
size_hint: (None, None)
size: (root.width, root.height)
pos: (root.pos[0], root.pos[1])
Label:
id: lab
text: '0%'
size_hint: (None, None)
size: self.texture_size
pos_hint: {'center_x': 0.5, 'center_y': 0.5}
CLS_PROGRESS_IMAGE:
size_hint: (None, None)
height: 100
width: 500
max: 100
background: '../images/empty.png'
progress_image: '../images/filled.png'
''')
return kv
if __name__ == '__main__':
DemoApp().run()