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