2017-02-01 3 views
1

Die Dokumentation bietet an example wie DragBehaviour zu verwenden, die so lange funktioniert, wie ich pos verwenden, um den Ort, um das Widget anzuzeigen, aber nicht, wenn ich pos_hint:ist pos_hint mit DragBehaviour in Kivy inkompatibel?

from kivy.uix.label import Label 
from kivy.app import App 
from kivy.uix.behaviors import DragBehavior 
from kivy.lang import Builder 

kv = ''' 
<DragLabel>: 
    # Define the properties for the DragLabel 
    drag_rectangle: self.x, self.y, self.width, self.height 
    drag_timeout: 10000000 
    drag_distance: 0 

FloatLayout: 
    DragLabel: 

     ################################## 
     ##### Comment this line and works! 
     pos_hint: {'x': 0.5, 'y':0.5} 


     size_hint: 0.25, 0.2 
     text: 'Drag me' 
''' 

class DragLabel(DragBehavior, Label): 
    pass 
class TestApp(App): 
    def build(self): 
     return Builder.load_string(kv) 
TestApp().run() 

Wie kann ich pos_hint mit DragBehaviour? Sind sie wegen der Art, wie Kivy Eigenschaften bindet, nicht kompatibel?

Antwort

0

Laut "Erstellen von Apps In Kivy" von Dusty Phillips:

Das Layout-pos auf der pos_hint basierend einstellt; sie sind keine streng unabhängigen Werte. Dasselbe gilt für size_hint. Aus diesem Grund müssen Sie bei Layouts explizit size_hint auf None setzen, wenn Sie die size direkt manipulieren möchten.

Mit anderen Worten, sowohl die FloatLayout und die DragBehavior wollen pos die Widgets setzen, und da das Layout auf den letzten Sprung bekommt, beendet sie gewinnen werden. Aber FloatLayout setzt die pos basierend auf der pos_hint, und versucht nicht, es festzulegen, wenn letzteres nicht initialisiert ist. Wenn Sie versuchen, size zu setzen, würde FloatLayoutsize_hint von (1,1) verwenden, um Sie außer Kraft zu setzen, es sei denn, Sie setzen size_hint zunächst explizit auf (None,None).

Verwandte Themen