我需要在Widget中画一条线。但我已经看到,在init方法完成之前,小部件的相对位置和大小都没有设置。
在实例化类时,如何在窗口小部件中绘制图形元素及其相对位置和尺寸? (我想避免Kv lang)
class Track(Widget):
def __init__(self,**kw):
super(Track, self).__init__(**kw)
with self.canvas:
Color(1,0,0)
Line(points = (self.x, (self.y + self.height) / 2, self.x + self.width, (self.y + self.height) / 2))
通过这种方式,它使用初始大小和位置绘制的线条是100,100和0,0但是Widget它在布局内部,所以我想使用相对位置和尺寸,我想在init
中绘制它答案 0 :(得分:1)
我想避免Kv lang
我建议放弃此限制。
通过这种方式,它使用初始大小和位置绘制的线是100,100和0,0但是Widget它在一个布局中,所以我想使用相对位置和大小我想画它在init
中
您有三种选择。第一种是在时钟(kivy.clock.Clock
)计划功能中绘制它,该功能在小部件定位后运行 - 执行Clock.schedule_once(the_func, 0)
就足够了,0
将计算推迟到在小部件定位(假设正常布局)之后但在下一帧之前。缺点是该线将被固定,并且如果是否移动则不会与小部件匹配,例如,可能在窗口调整大小期间。
第二个(也是更好的)选项是像现在一样绘制直线,但绑定到窗口小部件pos并调整一个适当重新定位它的函数。例如self.bind(pos=self.line_setter, size=self.line_setter)
self.line_setter
并self.line.points = [...]
成为self.line = Line(...)
的方法。您还需要使用{{1}}保存对该行的引用。
第三个(通常是最好的)选项是使用kv语言,它会自动为您创建绑定而无需其他语法。