【问题标题】:Kivy Widget positioning in ScrollViewKivy Widget 在 ScrollView 中的定位
【发布时间】:2014-06-17 01:18:08
【问题描述】:

我在滚动视图的网格布局中有一个标签。我的目标是通过代码中的标签(而不是在 .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_locall.to_parentl.to_widgetl.to_window,但它们都返回 (0, 0)。如何获得标签的正确位置,使线条在标签内?

【问题讨论】:

    标签: python kivy


    【解决方案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 或大小值)并更改instance.line 的点。如果您定义自己的 Label 子类,这可能是最自然的 l 方法。

    kv 会自动处理这个问题,这让事情变得更简单,这也是我们建议尽可能使用它的原因之一。

    【讨论】:

    • 这可以解决所有问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多