我想绘制椭圆内嵌套椭圆的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
我仍然无法将文字显示在/内/椭圆中。
答案 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。这样你就可以避免代码重复,并且如果你改变了定位要求,你可以轻松地同时更新标签和椭圆。