2015-11-03 5 views
2

Я пытаюсь нарисовать собственную графику на холсте киви. На данный момент у меня есть красный или зеленый прямоугольник, который меняет цвет один раз в секунду, но я хочу добавить изменяющуюся текстовую метку.Рендеринг текста на холст киви

После небольшого поиска выясняется, что нет никакой «текстовой» инструкции, которая может быть добавлена ​​к холсту. Я нашел несколько ссылок на использование виджета Label(), а также инструкции по холсту, но это не кажется идеальным, и я не могу заставить его визуализировать более одного раза.

Вот мой объект, как он стоит на данный момент:

class HVObject(BoxLayout): 
    def __init__(self, **kwargs): 
     BoxLayout.__init__(self, **kwargs) 
     self.colour = 1 
     self.label = Label() 
     self.render() 
     self.add_widget(self.label) 

     self.bind(size=self._update_rect, pos=self._update_rect) 
     Clock.schedule_interval(self.callevery, 1) 

    def render(self): 
     self.canvas.clear() 
     self.rect = Rectangle(size=self.size, pos=self.pos) 
     self.canvas.add(Color(1-self.colour, self.colour, 0, 1)) 
     self.canvas.add(self.rect) 
     self.label.text = "COL %d" % self.colour 
     self.canvas.ask_update() 

    def callevery(self, x): 
     self.colour = 1-self.colour 
     self.render() 

    def _update_rect(self, instance, value): 
     self.rect.pos = instance.pos 
     self.rect.size = instance.size 
     self.label.pos = instance.pos 

Есть простой способ для достижения эффекта мне нужно?

Спасибо

ответ

3

Отвечая на мой собственный вопрос:

После небольшого взгляда вокруг [kivy] саду, я нашел Tickline (и Tick). и использование CoreLabel() и Rectangle (texture = ...)

Вот мой обновленный метод render(), который добавляет текстовый объект, в котором я нуждаюсь.

def render(self): 
     self.canvas.clear() 
     self.canvas.add(Color(1-self.colour, self.colour, 0, 1)) 
     self.rect = Rectangle(size=self.size, pos=self.pos) 
     self.canvas.add(self.rect) 
     label = CoreLabel(text="COL %d" % self.colour, font_size=20) 
     label.refresh() 
     text = label.texture 
     self.canvas.add(Color(self.colour, 1-self.colour,0, 1)) 
     pos = list(self.pos[i] + (self.size[i] - text.size[i])/2 for i in range(2)) 
     self.canvas.add(Rectangle(size=text.size, pos=pos, texture=text)) 
     self.canvas.ask_update() 

Это работает для меня, хотя и немного неуклюже!

Смежные вопросы