2015-06-21 163 views
1

我一直在使用尺寸提示来确定Kivy中的许多布局。但是,无论何时使用大小提示,我都无法从大小属性获取布局的绝对大小(像素大小)。我发现在将size_hint设置为None之后,只能从布局的size属性中获取绝对大小。我如何获得绝对大小并同时使用大小提示?有没有方法或我可以打电话?如何在使用尺寸提示时获得Kivy布局的绝对尺寸

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

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() 

此打印出:

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

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

回答

0

即使使用size_hint,size属性也包含小部件的实际大小。

也许您在父布局有时间设置其子级大小之前正在访问它,即在它们被实例化并添加之后,但可能在下一帧之前。如果是这种情况,你可以粗略地使用Clock.schedule_once函数来检查0区间(意味着在下一帧之后),或者更一般地说,它通常是绑定到属性并在更新时更新内容的方式。

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