Как рисовать детей поверх других (не родительских) виджетов в Kivy? - PullRequest
0 голосов
/ 08 января 2019

Я хочу нарисовать детей киви виджета поверх их родителей "братьев и сестер". Под братом я имею в виду виджет того же класса, что и класс их родителей, но другой экземпляр. Киви рисует их по умолчанию в том же порядке, что и их соответствующие родители: первый родитель, все его дети, затем второй родитель, все его дети и т. Д. Таким образом, иногда ребенок находится на вершине своего «дяди», а иногда и ниже, в зависимости от того, кто был нарисован первым, их родитель или их «дядя».

Я понимаю основы дерева видений kivy (или, по крайней мере, надеюсь, что понимаю), но не могу понять, как повлиять на порядок рисования детей. Я думаю, должно быть что-то, чего мне не хватает. В качестве примечания: я хочу создавать (и удалять) дочерние виджеты во время выполнения.


       from kivy.app import App
       from kivy.uix.floatlayout import FloatLayout
       from kivy.uix.button import Button

<pre><code>   class ParentButton(Button):
       def __init__(self, pos, **kwargs):
           super().__init__(**kwargs)
           self.size_hint = None, None
           self.pos = pos
      def on_release(self):
          self.add_widget(ChildButton())

  class ChildButton(Button):
      def __init__(self, **kwargs):
          super().__init__(**kwargs)
          self.size_hint = None, None
          self.pos = (0, 0)
      def on_release(self):
          if self.parent.pos[0] &lt; 150:
              self.pos = (150, 50)
          else:
              self.pos = (150, 150)

  class Layout(FloatLayout):
      def __init__(self, **kwargs):
          super().__init__(**kwargs)
          self.add_widget(ParentButton((100, 100)))
          self.add_widget(ParentButton((200, 100)))

  class TestApp(App):
      def build(self):
          return Layout()

  if __name__ == '__main__':
      TestApp().run()

В моем примере кода у меня есть две кнопки, каждая из которых создает дочернюю кнопку. При нажатии дочерней кнопки она перемещается так, что перекрывается со своим собственным родителем и с другой кнопкой, которая не является ее родителем, но того же класса. Кнопка, созданная левой кнопкой, будет нарисована сверху левой кнопки, но ниже правой кнопки. Кнопка, созданная правой кнопкой, будет нарисована поверх обоих. Это на самом деле ожидаемое поведение, но я хочу изменить его так, чтобы все дети были выше (или ниже) всего своего родительского класса. Может кто-нибудь помочь здесь?

1 Ответ

0 голосов
/ 09 января 2019

Можно вручную манипулировать списком canvas.children, чтобы влиять на порядок рисования, без необходимости вообще изменять порядок дочерних элементов виджета. Вы, вероятно, должны быть осторожны, только чтобы изменить его порядок, а не удалять что-либо за пределами обычных вызовов remove_widget.

В общем случае это происходит редко, потому что обычно проще просто изменить порядок виджетов как дочерних элементов родителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...