2014-06-17 42 views
0

我在scrollview的gridlayout中有一個標籤。我的目標是通過代碼中的標籤(而不是.kv文件中)繪製對角線斜線(等等)。我一直在試圖與Kivy Widget在ScrollView中的定位

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),並且是無處標籤附近。如果我不得不猜測這個問題,我猜想問題是這個位置是根據scrollview而定的,我希望定位來自網格佈局。我試過使用l.to_local,l.to_parent,l.to_widgetl.to_window,但它們都返回(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或大小值),並改變了instance.line點。如果你定義了你自己的Label子類,這可能很自然地是l的一種方法。

kv會自動處理這個問題,這會讓事情變得更簡單,也是我們建議儘可能使用它的原因之一。

+0

修復了一切。謝謝 –