我在scrollview中的gridlayout中有一个标签。我的目标是通过代码中的标签(而不是.kv文件)绘制斜线(以及其他内容)。我一直试图用
来实现这一目标with l.canvas: #l is my label
Color(1.0, 0.0, 0.0)
Line(points=[l.x, l.y, l.x+l.width, l.y+.height], width=1.2, cap='square')
然而,这会产生一条红线,从屏幕的左下角开始,位于(0,0)位置,并且不在标签附近。如果我不得不猜测这个问题,我猜测问题是位置是滚动视图的,我希望定位来自网格布局。我尝试过使用l.to_local
,l.to_parent
,l.to_widget
和l.to_window
,但它们都返回(0,0)。如何获得标签的正确位置,以便该行位于标签内?
答案 0 :(得分:1)
您没有说在哪里编写此代码,但我猜它与小部件的__init__
同时存在。
假设是这样,这是因为小部件位置是 0, 0
,直到它的父级设置它(例如BoxLayout重新排列其子节点),这发生在__init__
之后。也就是说,在绘制时将线条绘制在正确的位置,但是标签稍后移动,并且线条保持在同一位置,因为您没有告诉它做任何其他事情。
您可以通过保留对该行的引用并在填充更改时重置其点来解决此问题。
with l.canvas: #l is my label
Color(1.0, 0.0, 0.0)
l.line = Line(points=[l.x, l.y, l.x+l.width, l.y+.height], width=1.2, cap='square')
l.bind(pos=line_reset_func, size=line_reset_func)
...你显然必须定义你的line_reset_func,它接受两个参数(我认为标签实例和新的pos或size值)并改变instance.line
的点。如果您定义自己的Label子类,这可能最自然地是l
的方法。
kv会自动处理这种情况,这样可以使事情变得更简单,这也是我们建议尽可能使用它的一个原因。