在kivy中向椭圆对象添加标签或文本

时间:2013-12-14 21:04:32

标签: user-interface kivy

我想绘制椭圆内嵌套椭圆的x,y坐标。但是,我恐怕我不了解对象层次结构,不知道如何做到这一点。我已经尝试添加一个标签事件作为Ellipse的子项,我知道它没有我可以直接修改的'text'属性(因为它不是Button或Label)。这就是我所拥有的:

    MyWidget:
        canvas.before:
            Color:
                rgba: 1,0,0,1
            Ellipse:
                size: min(self.size)*0.2, min(self.size)*0.2
                pos: (self.x), (self.y)
            Label:
                text: unicode(self.x), unicode(self.y)

错误:

 >>   40:                Label:
      41:                    text: unicode(self.x), unicode(self.y)
 ...
 You can add only graphics Instruction in canvas.

所以,我把它添加到Ellipse的一个孩子:

    MyWidget:
        canvas.before:
            Color:
                rgba: 1,0,0,1
            Ellipse:
                size: min(self.size)*0.2, min(self.size)*0.2
                pos: (self.x), (self.y)
                Label:
                    text: unicode(self.x), unicode(self.y)

 >>   40:                Label:
      41:                    text: unicode(self.x), unicode(self.y)
 ...
 You can add only graphics Instruction in canvas.

所以,我试着把它放在画布上:

    MyWidget:
        canvas.before:
            Color:
                rgba: 1,0,0,1
            Ellipse:
                size: min(self.size)*0.2, min(self.size)*0.2
                pos: (self.x), (self.y)
                canvas:
                    Label:
                        text: unicode(self.x), unicode(self.y)

没有错误,但不显示任何文字。

更新以解决下面的优秀答案

  MyWidget:
        canvas.before:
            Color:
                rgba: 1,0,0,1
            Ellipse:
                size: min(self.size)*0.2, min(self.size)*0.2
                pos: (self.x, self.y)
        Label:
            pos: (self.x,self.y)
            size: min(self.size)*0.2, min(self.size)*0.2
            text: "{},{}".format(str(self.x),str(self.y))

给我以下错误:

      44:            Label:
 >>   45:                pos: (self.x, self.y)
      46:                size: min(self.size)*0.2, min(self.size)*0.2
      47:                text: "{},{}".format(str(self.x),str(self.y))
 ...
 RuntimeError: maximum recursion depth exceeded while calling a Python object

我仍然无法将文字显示在/内/椭圆中。

1 个答案:

答案 0 :(得分:4)

您的问题是无法将画布与小部件混合。

一种思考方式是每个小部件都有画布。您可以在画布上绘制您喜欢的内容,但关键字是 draw - 您可以使用kivy图形指令,如Ellipse或Rectangle或Line(或Translate和Rotate等上下文指令)。但是,您无法使用小部件。它们不是那样工作的,它们不是你在画布上绘制的东西,它们是小部件。当你使用add_widget将一个小部件添加到另一个小部件时,发生的一件事是它的画布在另一个小组的画布上绘制,但这是保留在画布上的 - 尝试绘制一个画面没有意义画布上的整个小部件。

这是你所有错误的根源; Ellipse不是小部件。它没有画布,它只是你在画布上绘制的东西。它不能有孩子,因为它不是一个小部件。在kv语言中,关键字canvas(和canvas.before等)并不意味着有一个名为canvas的子小部件,它只是一个特殊的语法,指的是画布。父小部件。

因此,要真正解决您的问题,您需要将Label从画布中取出。以下内容应该有效:

MyWidget:
    canvas.before:
        Color:
            rgba: 1,0,0,1
        Ellipse:
            size: min(self.size)*0.2, min(self.size)*0.2
            pos: (self.x), (self.y)
    Label:
        pos: root.pos
        size: min(self.size)*0.2, min(self.size)*0.2
        text: unicode(self.x), unicode(self.y)

这当然是使Label成为MyWidget的子代的常用语法。重要的是它被赋予了与椭圆相同的位置和大小,因此,由于文本默认居中,因此文本将出现在椭圆的中间。如果文本很长或者您可能想要使用其他内容来设置text_size以自动换行,那么这是一个不同的问题。

此外,一旦你有多个具有相同大小描述的小部件(比如我的例子中的Label和Ellipse的大小),通常更适合将计算移动到不同的地方 - 例如MyWidget的NumericProperty。这样你就可以避免代码重复,并且如果你改变了定位要求,你可以轻松地同时更新标签和椭圆。