【问题标题】:how to get the absolute size of Kivy layouts when using size hints使用大小提示时如何获取 Kivy 布局的绝对大小
【发布时间】:2015-06-21 20:56:05
【问题描述】:

我一直在使用尺寸提示来调整我在 Kivy 中的许多布局。但是,无论何时使用大小提示,我都无法从 size 属性中获取布局的绝对大小(像素大小)。我发现在将 size_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()

打印出来:

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

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

【问题讨论】:

    标签: python layout size kivy


    【解决方案1】:

    size 属性确实包含小部件的实际大小,即使带有 size_hint。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多