Python 如何在使用大小提示时获得Kivy布局的绝对大小

Python 如何在使用大小提示时获得Kivy布局的绝对大小,python,layout,size,kivy,Python,Layout,Size,Kivy,我一直在使用大小提示来调整Kivy中许多布局的大小。但是,无论何时使用大小提示,我都无法从size属性获取布局的绝对大小(像素大小)。我发现,在将size\u hint设置为None之后,您只能从布局的size属性获取绝对大小。如何获得绝对大小并同时使用大小提示?有什么方法或东西我可以调用吗 我在下面添加了一个简单的示例 from kivy.lang import Builder from kivy.lang import Builder from kivy.app import App fro

我一直在使用大小提示来调整Kivy中许多布局的大小。但是,无论何时使用大小提示,我都无法从size属性获取布局的绝对大小(像素大小)。我发现,在将size\u hint设置为None之后,您只能从布局的size属性获取绝对大小。如何获得绝对大小并同时使用大小提示?有什么方法或东西我可以调用吗

我在下面添加了一个简单的示例

from kivy.lang import Builder
from kivy.lang import Builder
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.core.window import Window

Builder.load_string('''
<MasterLayout>:
    orientation: 'vertical'

    BoxLayout:
        id: layout1
        orientation: 'vertical'
        size_hint: 1.0, 0.2
        canvas:
            Color:
                rgb: 1, 0, 0
            Rectangle:
                size: self.size
                pos: self.pos

    BoxLayout:
        id: layout2
        orientation: 'vertical'
        size_hint: 1.0, 0.8
        canvas:
            Color:
                rgb: 0, 1, 0
            Rectangle:
                size: self.size
                pos: self.pos
''')


class MasterLayout(BoxLayout):

    def __init__(self, **kwargs):
        super(MasterLayout, self).__init__(**kwargs)

        Window.size = [300, 300]
        print self.ids['layout1'].size
        print self.ids['layout1'].size_hint
        print self.ids['layout2'].size
        print self.ids['layout2'].size_hint

class myApp(App):

    def build(self):

        app = MasterLayout()

        print app.ids['layout1'].size
        print app.ids['layout1'].size_hint
        print app.ids['layout2'].size
        print app.ids['layout2'].size_hint

        return app


if __name__=='__main__':

    myApp().run()

我应该得到的两个尺寸列表是布局1的[300,60]和布局2的[300,240]。更改窗口大小后,我需要init块中某些布局的绝对大小。类似于上面的简单代码。我可以根据大小提示和窗口大小来计算它,但是当我开始嵌套许多布局层时,它会变得复杂,这些布局层可能包括也可能不包括小部件之间的填充和间距。再次感谢您的帮助。

size属性确实包含小部件的实际大小,即使有大小提示

也许您是在父布局有时间设置其子布局的大小之前访问它,即在实例化和添加它们之后,但可能在下一帧之前。如果是这种情况,您可以粗略地将Clock.schedule_函数安排一次,以便在
0
间隔后(这意味着在下一帧之后)进行检查,或者更一般地说,它通常是绑定到属性并在属性发生更改时进行更新的一种简单方法

如果你举一个你正在尝试的例子,我可以给出一个更直接的答案

[100, 100]
[1, 0.2]
[100, 100]
[1, 0.8]
[100, 100]
[1, 0.2]
[100, 100]
[1, 0.8]