StackLayout的Kivy子小部件都具有(0,0)的pos吗?

时间:2018-08-19 14:15:30

标签: python python-3.x kivy

遍历动态添加(通过循环)的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正常运行,并且放置正确,但是不知道控件的位置未注册?

1 个答案:

答案 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]