遍历动态添加(通过循环)的StackLayout
的子代时,所有子代位置的输出为0,0
。一个简单的例子:
import kivy
from kivy.app import App
from kivy.uix.stacklayout import StackLayout
from kivy.uix.button import Button
class ThisApp(App):
def build(self):
layout = StackLayout(spacing=10,padding=10)
for i in range(3):
layout.add_widget(Button(size_hint=(None,None)))
print(layout.children[i].pos)
return layout
ThisApp().run()
输出:
[0, 0]
[0, 0]
[0, 0]
这是为什么?显然,小部件的位置不在窗口的左下方。我根本不明白为什么会这样。 StackLayout
正常运行,并且放置正确,但是不知道控件的位置未注册?
答案 0 :(得分:0)
布局不会立即起作用,而是在必要时(即显示小部件时)起作用,因此我们必须使用Clock.schedule_once(...)
在显示框架之后立即调用该函数。
import kivy
from kivy.app import App
from kivy.uix.stacklayout import StackLayout
from kivy.uix.button import Button
from kivy.clock import Clock
class ThisApp(App):
def build(self):
def callback(dt):
for i, child in enumerate(self.root.children):
print(i, child.pos)
layout = StackLayout(spacing=10,padding=10)
for i in range(3):
layout.add_widget(Button(size_hint=(None,None)))
Clock.schedule_once(callback)
return layout
if __name__ == '__main__':
ThisApp().run()
输出:
0 [230, 370]
1 [120, 370]
2 [10, 370]