Python 如何在Kivy中的其他(非父)小部件上绘制子部件?

Python 如何在Kivy中的其他(非父)小部件上绘制子部件?,python,kivy,Python,Kivy,我想在他们父母的“兄弟姐妹”上画一个kivy小部件的孩子。我所说的同级指的是与父类属于同一类但属于不同实例的小部件。 Kivy默认情况下按照与各自父母相同的顺序绘制这些图形:第一个父母、其所有子女、第二个父母、其所有子女等。因此,有时一个子女位于其“叔叔”的上方,有时位于下方,具体取决于先绘制的是谁、他们的父母还是他们的“叔叔” 我了解kivy widget树的基本知识(或者至少我希望我了解),但不知道如何影响孩子们的绘制顺序。我想我一定错过了什么。 作为旁注:我想在运行时创建(和删除)子窗口小

我想在他们父母的“兄弟姐妹”上画一个kivy小部件的孩子。我所说的同级指的是与父类属于同一类但属于不同实例的小部件。 Kivy默认情况下按照与各自父母相同的顺序绘制这些图形:第一个父母、其所有子女、第二个父母、其所有子女等。因此,有时一个子女位于其“叔叔”的上方,有时位于下方,具体取决于先绘制的是谁、他们的父母还是他们的“叔叔”

我了解kivy widget树的基本知识(或者至少我希望我了解),但不知道如何影响孩子们的绘制顺序。我想我一定错过了什么。 作为旁注:我想在运行时创建(和删除)子窗口小部件


       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()

在我的代码示例中,我有两个按钮,每个按钮创建一个子按钮。当按下子按钮时,它会移动,以便与自己的父按钮和另一个按钮重叠,该按钮不是它的父按钮,而是属于同一类。由左按钮创建的按钮将绘制在左按钮的顶部,但在右按钮的下方。右按钮创建的按钮将绘制在两个按钮的顶部。这实际上是预期的行为,但我想改变它,使所有的孩子都高于(或低于)他们的父类。有人能帮忙吗?

可以手动操作canvas.children列表以影响绘图顺序,而无需更改小部件子项的顺序。不过,您可能只需要对其重新排序,而不需要删除正常remove_小部件调用之外的任何内容


通常很少出现这种情况,因为通常最简单的方法是将小部件重新排序为父项的子项。

我不确定是否正确理解您的意思:您是否建议将ChildButton作为正确父项的子项,而不是操纵绘图顺序?这实际上解决了问题,因为我永远不需要在父母和叔叔身上重叠,但在我的上下文中这不是很直观。与此同时,我在维基百科上学习了树遍历(不幸的是,我没有电脑作为背景),我想我可以重新表述一下这个问题:kivy使用预排序树遍历进行绘图,是否可以使其宽度优先?