如何在Kivy中将孩子吸引到其他(非父)小部件之上?

时间:2019-01-08 18:39:17

标签: python kivy

我想在他们的父母“兄弟姐妹”上画一个猕猴桃小部件的孩子。同胞,我的意思是与父类的类相同的小部件,但实例不同。 默认情况下,Kivy会按照与各自父母相同的顺序绘制这些图像:第一位父母,其所有子女,第二位父母,其所有子女等。因此,有时一个孩子位于其“叔叔”的上方,有时位于其“叔叔”的下方,取决于先绘制的是他们的父母还是他们的“叔叔”。

我了解kivy小部件树的基本知识(或者至少希望如此),但无法弄清楚如何影响孩子的绘画顺序。我想一定是我想念的东西。 附带说明:我想在运行时创建(和删除)子窗口小部件。


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

   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] < 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 :(得分:0)

可以手动操纵canvas.children列表以影响绘图顺序,而无需完全更改小部件子级的顺序。不过,您可能只需要注意重新排序,而不要除去正常的remove_widget调用之外的任何内容。

通常很少出现这种情况,因为将小部件重新排列为父级的子级通常最简单。