在init方法中使用窗口小部件相对坐标绘制线

时间:2014-08-01 09:16:17

标签: python kivy

我需要在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

中绘制它

1 个答案:

答案 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_setterself.line.points = [...]成为self.line = Line(...)的方法。您还需要使用{{1}}保存对该行的引用。

第三个(通常是最好的)选项是使用kv语言,它会自动为您创建绑定而无需其他语法。