Kivy 自学笔记(二):BoxLayout

文章介绍了Kivy框架中BoxLayout的使用,包括定向(orientation)、尺寸提示(size_hint)、位置提示(pos_hint)和间隔(spacing)等属性。示例代码展示了如何创建和配置BoxLayout以实现子控件的水平或垂直排列,并特别提到size_hint和pos_hint在确定控件大小和位置时的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2023年1月15日,更新(纠错)中。

声明:1、本文章总结自该系列视频,且为个人用笔记,转载需注明出处。2、让人不适的评论将会被删评+屏蔽。

BoxLayout用于水平(竖直)排列子控件。

一、代码与解释

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout

class BoxLayoutTest(BoxLayout):
    pass

class MyTask(App):
    pass

if __name__ == '__main__':
    MyTask().run()
BoxLayoutTest:

<BoxLayoutTest>:
    # orientation: "vertical" # 定向,默认为水平horizontal
    BoxLayout: # 嵌套了一个竖直排列的子BoxLayout
        orientation: "vertical" 
        size_hint: .5, .8 # 尺寸提示
        pos_hint: {'center_y':.5, 'center_x':.5} # 位置提示
        spacing: '10dp'
        Button: # 子子button
            text: "fxxk U 01"
            size_hint: 1, .5
            color: 1,0,1,1
        Button:
            text: "fxxk U 02"
            size_hint: 1, 1
            color: 1,1,0,1
    Button: # 子button
        text: "fxxk U 1"
        size_hint: None, .5 # 只有尺寸提示某项为None时,才可使用对应的宽高按绝对尺寸控制宽高
        width: '100dp' # 由于尺寸提示宽度部分为None,使用width设定宽度为100dp
        pos_hint: {'center_y':.5}
        color: 1,1,1,1
    Button:
        text: "fxxk U 2"
        size_hint: .5, .5
        color: 0,1,1,1

1、orientation(定向)

BoxLayout的orientation有两种,分别为horizontal和vertical,对应着水平排布和垂直排布。

2、size_hint(尺寸提示)

BoxLayout不可直接使用size、width、height,除非size_hint对应项为None,此时可以用前三者直接定义宽高。size_hint为两个0-1的浮点数,分别对应宽度和高度。以当orientation为horizontal时为例,此时size_hint水平部分为该控件的水平宽度权重,而竖直部分为该控件占BoxLayout总高度的比例。同时,若水平方向有size_hint为None,即存在定义了dp或者像素宽度的情况,则需要先让总宽度减去这部分控件宽度,其余控件再按照各自的size_hint按比例分配剩余宽度。

3、pos_hint(位置提示)

与size_hint不同,pos_hint为一个字典,也分为水平和竖直方向。其中水平方向的key包括’x’, ‘center_x’, ‘right’,均为0-1的浮点数,分别代表控件左侧距最左端的距离,控件中心距最左端的距离,控件右侧距最左端的距离,三者取一即可。竖直方向的key包括’y’, ‘center_y’, ‘top’,其余类似。

注意:①若orientation为horizontal,则pos_hint的水平部分失效,反之同理。②尽管pos_hint字典内部可以同时包含同一方向的不同key(即取了大于一个)且不报错,但具体效果与取的key均不完全相同,为避免意外发生最好不要这么干。

4、spacing(间隔)

使用spacing使不同控件间隔一定距离。

二、运行效果

如下两图,可以看出水平拉伸时中间size_hint的x为None的按钮宽度始终不变。
在这里插入图片描述

### KivyBoxLayout对象没有font_size属性的错误解决方案 在Kivy中,`BoxLayout` 是一种布局管理器,用于组织子小部件的位置和大小。然而,`BoxLayout` 本身并不具备像 `font_size` 这样的属性,因为这些属性通常属于具体的 UI 小部件(如 `Label` 或 `Button`)。如果尝试直接访问 `BoxLayout` 的 `font_size` 属性,将会引发 `AttributeError` 错误[^1]。 #### 解决方案 以下是解决该问题的详细方法: 1. **明确属性归属的小部件** 确保将 `font_size` 属性分配给实际支持该属性的小部件,例如 `Label` 或 `Button`。以下是一个示例代码,展示如何正确设置字体大小: ```python from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.label import Label class MyBoxLayout(BoxLayout): def __init__(self, **kwargs): super(MyBoxLayout, self).__init__(**kwargs) self.orientation = 'vertical' label = Label(text="Hello, World!", font_size=24) # 设置Label的font_size self.add_widget(label) class MyApp(App): def build(self): return MyBoxLayout() if __name__ == '__main__': MyApp().run() ``` 2. **检查代码逻辑** 如果在代码中错误地尝试为 `BoxLayout` 设置 `font_size`,需要重新审视代码逻辑,确保属性被分配给正确的对象。例如,避免以下错误代码: ```python box_layout = BoxLayout(font_size=24) # 错误:BoxLayout没有font_size属性 ``` 3. **使用KV语言定义界面** 使用 KV 语言可以更清晰地定义界面元素及其属性。以下是一个 KV 文件示例,展示如何正确设置字体大小: ```python from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.lang import Builder Builder.load_string(""" <MyBoxLayout>: orientation: 'vertical' Label: text: "Hello, World!" font_size: 24 # 正确:Label的font_size """) class MyBoxLayout(BoxLayout): pass class MyApp(App): def build(self): return MyBoxLayout() if __name__ == '__main__': MyApp().run() ``` 4. **排查其他潜在问题** 如果仍然遇到类似错误,可能是因为代码结构问题。例如,某些属性可能被错误地定义在类级别而非实例方法中[^4]。确保所有与小部件相关的属性都在初始化方法(如 `__init__`)中正确设置。 #### 注意事项 - `BoxLayout` 只负责管理其子小部件的布局,而不直接处理字体、颜色等视觉属性。 - 如果需要动态调整字体大小,可以通过绑定事件或使用属性更新机制实现。 ### 示例代码 以下是一个完整的示例,展示如何在 `BoxLayout` 中正确设置字体大小: ```python from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Button from kivy.uix.label import Label class MyBoxLayout(BoxLayout): def __init__(self, **kwargs): super(MyBoxLayout, self).__init__(**kwargs) self.orientation = 'vertical' # 添加一个Label并设置font_size label = Label(text="Welcome to Kivy!", font_size=30) self.add_widget(label) # 添加一个Button并设置font_size button = Button(text="Click Me", font_size=20) self.add_widget(button) class MyApp(App): def build(self): return MyBoxLayout() if __name__ == '__main__': MyApp().run() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值