KIVY zindex动态变化

KIVY zindex dynamic change

我正在尝试在 Relativelayout 中添加 4 个框。只能水平移动相对布局中最后添加的框。当它靠近后来添加的盒子时,所有其他盒子都会被击中。在下面给定的示例代码中 'Actor 400' 在场景中水平自由移动。 'Actor 300' 能够在 'Actor 200' 和 'Actor 100' 上自由移动。但是当我尝试将 Actor 300 移动到 Actor 400 上方时,它会被击中,只有在鼠标移动到 Actor 400 之后,我才能移动。

我可以在触摸时动态更改小部件的 zindex 吗?

from kivy.app import App
from kivy.graphics import Line, Color
from kivy.uix.scatter import Scatter
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.lang import Builder

KV = '''
<Actor>:
    canvas:
        Color:
            rgba: 0,1,0,.8
        Rectangle:
            id: _rect_
            size: 100, 30
            pos: 0, root.height - 30
        Line:
            points: 50, root.height - 30, 50, 20
            width:2
    Label:
        id: _actr_lbl
        text: 'Hello World'
        color: 0,0,0,1
        size_hint: None, None
        size: 100, 30
        pos: 0, root.height - 30
'''


Builder.load_string(KV)
class Actor(Scatter):
    def __init__(self, **kwargs) :
        Name = kwargs.pop('Name', 'Actor-NoName')
        super(Actor, self).__init__(**kwargs)
        self.Name = Name
        self.ids._actr_lbl.text = Name

    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
           self.selected = True
           self.pos_hint = {'top':1}
           self.hint_diff_touch_to_x = self.right - touch.x
           return True
        return super(Actor, self).on_touch_down(touch)

    def on_touch_move(self, touch):
        if (self.selected) :
            future_right = touch.x +  self.hint_diff_touch_to_x
            if (future_right <= self.parent.size[0]) and ((future_right - self.width) >= 0) :
               self.right = future_right
               self.pos_hint = {'top':1}
               return True
        return super(Actor, self).on_touch_move(touch)

    def on_touch_up(self, touch):
        if (self.selected) :
            self.selected = False
            self.hint_diff_touch_to_x = 0
            self.iy = 0
            return True
        return super(Actor, self).on_touch_up(touch)

class MyPaintApp(App):

    def build(self):
        root = RelativeLayout()

        (ix, iy) = (100,100)

        clr = Color(0.2, 0.2, 1)

        for ix in [100, 200, 300, 400 ] :
            root.add_widget(Actor(Name = 'Actor ' + str(ix), pos=(ix,0), size_hint=(None,1)))

        return root

if __name__ == '__main__':
    Window.clearcolor = (1, 1, 1, 1)
    MyPaintApp().run()

当您的 Actor Widgets 之一被选中时,您可以将其移至顶部,方法是将其移除并重新添加,如下所示:

def on_touch_down(self, touch):
    if self.collide_point(*touch.pos):
       self.selected = True
       self.pos_hint = {'top':1}
       self.hint_diff_touch_to_x = self.right - touch.x
       parent = self.parent

       # move this Actor to the front
       parent.remove_widget(self)
       parent.add_widget(self)

       return True
    return super(Actor, self).on_touch_down(touch)