在初始坐标系下使用控件绘制相对坐标

2024-04-25 22:38:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在一个小部件内画一条线。但是我已经看到小部件的相对位置和大小在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))

用这种方法,它是用100100和0,0的初始大小和位置绘制的,但是小部件在布局中,所以我想用相对位置和大小,我想在init中画出来


Tags: 实例方法self图形元素langinit部件
1条回答
网友
1楼 · 发布于 2024-04-25 22:38:07

I would like to avoid Kv lang

我建议放弃这个限制。在

In this way the line it's drawn using the initial size and position which are 100,100 and 0,0 but the Widget it's inside a Layout so I'd like to use the relative position and size and I'd like to drawn it in the init

你有三个选择。第一种方法是在一个时钟(kivy.clock.Clock)调度函数中绘制它,该函数在小部件被定位之后运行——它应该足以完成Clock.schedule_once(the_func, 0),其中{}将计算推迟到小部件被定位后(假设为正常布局)但在下一帧之前。缺点是,行将被修复,如果有移动,将与小部件不匹配,例如可能在调整窗口大小时。在

第二个(也是更好的)选项是像现在一样画线,但是绑定到widget pos并调整一个函数的大小以适当地重新定位它。e、 g.self.bind(pos=self.line_setter, size=self.line_setter),并将self.line_setter作为一种适当的self.line.points = [...]的方法。您还需要用self.line = Line(...)保存对行的引用。在

第三个(通常也是最好的)选项是使用kv语言,它可以自动为您创建绑定,而不需要额外的语法。在

相关问题 更多 >