gpt4 book ai didi

python - 父控件如何定位其子控件?

转载 作者:行者123 更新时间:2023-12-01 05:39:49 24 4
gpt4 key购买 nike

我有一个 Kivy WidgetMainPage有一个子部件。这些子部件需要访问与其父部件相同的消息调度程序(与 Kivy 的 EventDispatcher 无关):

class MainPage(Widget):
def __init__(self, dispatcher):
self.child = ChildWidget(dispatcher)
self.add_widget(child1)

.kv内文件我定义了 <ChildWidget> 的视觉属性,但我没有指定它在 <MainPage> 中的位置。我想要<MainPage>指定其子级应该如何定位。这样的事情可能吗?

<ChildWidget>:
...

<MainPage>:
self.child:
pos: (10, 10)

最佳答案

假设 ChildWidget 仍然是 Kivy Widget (继承自 Widget 或其子类)。

[使用 kv 的简单方法]

如果您希望子级控制它在父级中的位置,您可以这样做::

<ChildWidget>
pos: (self.parent.x + 10, self.parent.y + 10) if self.parent else (100, 100)

为了控制 children 的位置,我们可以这样做::

<MainPage>
on_children:
# reposition children
root.reposition_children(args[1])
on_size:
# reposition children when parents size changes
root.reposition_children(self.children)
on_pos:
# reposition children when widgets size changes
root.reposition_children(self.children)

在你的.py中

class MainPage(Widget):
...
...
def reposition_children(self, children):
for child in children:
child.pos = x, y
child.size = d, e

【更详细、更完整的方式】

您本质上似乎想要的是您的主小部件表现得像 Layout 。此链接指向还包括内联文档的代码。代码本身是一个抽象类,为您提供如何构建/设计布局的指南。

您应该继承 Layout类并将您的小部件定位在do_layout中,通过 self.trigger_layout 调用它(这样小部件的定位会被延迟,直到它们需要显示在屏幕上之前,并且触发器可确保每帧不会多次调用该函数)。

你应该bind trigger_layout具有类似 children, size, pos... 的属性这样只要这些属性发生变化,就会重新触发 do_layout

关于python - 父控件如何定位其子控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17908538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com