KIVY Zindex Dynami c изменить - PullRequest
       29

KIVY Zindex Dynami c изменить

0 голосов
/ 23 апреля 2020

Я пытаюсь добавить 4 поля в Relativelayout. Умеет горизонтально перемещать только поле, которое добавляется последним в относительном расположении. Вся остальная коробка разбивается, когда она перемещается ближе к коробке, которая была добавлена ​​позже. В приведенном ниже примере кода «Actor 400» свободно перемещается по сцене горизонтально. «Актер 300» может свободно перемещаться по «Актеру 200» и «Актеру 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()

1 Ответ

1 голос
/ 23 апреля 2020

Когда выбран один из ваших 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...