User interface 向kivy中的椭圆对象添加标签或文本

User interface 向kivy中的椭圆对象添加标签或文本,user-interface,kivy,User Interface,Kivy,我想画一个嵌套椭圆的x,y坐标,在椭圆内。但是,恐怕我对对象层次结构的理解还不够,无法做到这一点。我曾尝试添加一个标签事件作为椭圆的子事件,但我知道它没有可以直接修改的“文本”属性(因为它不是按钮或标签)。以下是我所拥有的: MyWidget: canvas.before: Color: rgba: 1,0,0,1 Ellipse: size: min(self

我想画一个嵌套椭圆的x,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:
                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)
                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
我仍然无法将文本显示在椭圆中。

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

可以这样认为,每个小部件都有一个画布。你可以在画布上画你喜欢的东西,但是关键词是draw——你可以使用kivy图形指令,比如椭圆、矩形或直线(或者上下文指令,比如平移和旋转)。但是,您不能使用小部件。它们不是那样工作的,它们不是你在画布上画的东西,它们是小部件。当您使用
add_widget
将一个小部件添加到另一个小部件时,会发生的一件事是,它的画布绘制在另一个小部件的画布上,但这将保留在画布上-尝试在画布上绘制整个小部件是没有意义的

这是你所有错误的根源;椭圆不是一个小部件。它没有画布,只是你在画布上画的东西。它不能有孩子,因为它不是一个小部件。在kv语言中,关键字
canvas
(和
canvas.before
等)并不意味着有一个名为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)
    Label:
        pos: root.pos
        size: min(self.size)*0.2, min(self.size)*0.2
        text: unicode(self.x), unicode(self.y)
这当然是使标签只是MyWidget的子项的正常语法。重要的部分是它被赋予与椭圆相同的位置和大小,因此,由于文本默认为中心,文本将出现在椭圆的中间。如果文本很长,或者您可能希望使用其他功能,例如设置
text\u size
自动换行,但这是另一个问题

此外,一旦您有多个具有相同大小描述的小部件(如我的示例中的标签和椭圆的大小),将该计算移动到不同的位置通常会更整洁—例如MyWidget的NumericProperty。这样可以避免代码重复,并且如果您更改了定位要求,您可以轻松地同时更新标签和椭圆。

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

可以这样认为,每个小部件都有一个画布。你可以在画布上画你喜欢的东西,但是关键词是draw——你可以使用kivy图形指令,比如椭圆、矩形或直线(或者上下文指令,比如平移和旋转)。但是,您不能使用小部件。它们不是那样工作的,它们不是你在画布上画的东西,它们是小部件。当您使用
add_widget
将一个小部件添加到另一个小部件时,会发生的一件事是,它的画布绘制在另一个小部件的画布上,但这将保留在画布上-尝试在画布上绘制整个小部件是没有意义的

这是你所有错误的根源;椭圆不是一个小部件。它没有画布,只是你在画布上画的东西。它不能有孩子,因为它不是一个小部件。在kv语言中,关键字
canvas
(和
canvas.before
等)并不意味着有一个名为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)
    Label:
        pos: root.pos
        size: min(self.size)*0.2, min(self.size)*0.2
        text: unicode(self.x), unicode(self.y)
这当然是使标签只是MyWidget的子项的正常语法。重要的部分是它被赋予与椭圆相同的位置和大小,因此,由于文本默认为中心,文本将出现在椭圆的中间。如果文本很长,或者您可能希望使用其他功能,例如设置
text\u size
自动换行,但这是另一个问题


此外,一旦您有多个具有相同大小描述的小部件(如我的示例中的标签和椭圆的大小),将该计算移动到不同的位置通常会更整洁—例如MyWidget的NumericProperty。这样可以避免代码重复,并且如果更改定位要求,您可以轻松地同时更新标签和椭圆。

这在我的一般错误中很有趣,也很有启发性,但标签似乎远离椭圆。它位于父窗口小部件的左下角。如果我在椭圆外定义标签,我如何引用椭圆本身的位置?你复制了我的实际代码吗?解决方案的一部分是,您必须将标签的位置和大小设置为您想要的,这就是我通过将标签的位置和大小定义为与椭圆相同所做的。在我的回答中,我也对这一点进行了评论,阅读了最后一段。起初,我复制了你的实际代码,感觉我理解了你所做的区别,但我的实际用例代码做了很多复杂的事情——定位和重新定位椭圆——你的成功了,但将标签定位在父对象的角落。它试图使这一切成为MyWidget的数字属性,但如何做到这一点显然超出了我的能力,我需要进行更多的练习。我很困惑,在圆圈中添加文字太难了。KV比html+css更难格式化任何东西。谢谢你,一切都好