【问题标题】:How to draw children on top of other (non-parent) widgets in Kivy?如何在 Kivy 中的其他(非父级)小部件之上绘制子级?
【发布时间】:2019-01-09 06:17:35
【问题描述】:

我想在他们的父母“兄弟姐妹”之上绘制一个 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()

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

【问题讨论】:

    标签: python kivy


    【解决方案1】:

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

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

    【讨论】:

    • 我不确定我是否理解正确:您是否建议将 ChildButton 作为正确父级的子级而不是操纵绘图顺序?这实际上解决了这个问题,因为我不需要在父母和叔叔上重叠,但在我的上下文中它不是很直观。同时我在 wikipedia 上了解了树遍历(不幸的是我没有电脑,因为背景),我想我可以改写这个问题:kivy 使用预购树遍历进行绘图,是否有可能首先使其广度?
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2021-11-18
    相关资源
    最近更新 更多