将文本渲染到Kivy画布上

9
我正在尝试在kivy的“画布”中绘制自己的图形。目前,我有一个红色或绿色的矩形,每秒钟改变一次颜色,但我想添加一个可变的文本标签。
经过一番搜索,似乎没有可以添加到画布的“文本”指令。我找到了一些关于使用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

有没有一种简单的方法来实现我需要的效果?

谢谢

1个回答

9
回答我的问题:
在浏览了[kivy] garden之后,我发现了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()

对我来说这样做还行,虽然有点笨拙!

这个技巧也可以在Kivy的论坛上找到:https://groups.google.com/g/kivy-users/c/zRCjfhBcX4c/m/G5WYz9SHFMUJ - butla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接