You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何控制Kivy中Splitter容器内标签和按钮的初始尺寸与定位

核心修改点

  • 给承载棋盘、按钮栏的垂直BoxLayout添加spacing=10参数,实现棋盘和下方控件的小段间距
  • 给标签+按钮的水平布局设置固定高度,避免按钮被拉伸变形,同时保证棋盘可以占满剩余的所有可用空间
  • 删除Image冗余的pos参数,放在BoxLayout内的控件位置会自动适配,不需要手动指定
  • 所有修改都在ChessBoardWidget内部完成,完全兼容现有Splitter的大小调整逻辑,所有元素会跟着Splitter缩放适配

修改后完整代码如下:

import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.splitter import Splitter
from kivy.uix.image import Image

kivy.require('2.0.0')

class ChessBoardWidget(RelativeLayout):
    def __init__(self, **kwargs):
        super(ChessBoardWidget, self).__init__(**kwargs)

        # 底部标签+按钮的水平布局,固定高度避免拉伸
        repertoire_boxlayout = BoxLayout(orientation='horizontal', size_hint_y=None, height=40)
        repertoire_boxlayout.add_widget(Label(text='Repertoire for:'))
        repertoire_boxlayout.add_widget(Button(text='White'))
        repertoire_boxlayout.add_widget(Button(text='Black'))

        # 垂直布局加spacing实现棋盘和按钮栏的间距
        chessboard_gui_boxlayout = BoxLayout(orientation='vertical', spacing=10, size_hint=(1,1))
        chessboard_gui_boxlayout.add_widget(
            Image(source="./data/images/chess-pieces/DarkerGreenGreyChessBoard.png",
                  size_hint=(1, 1), keep_ratio=True, allow_stretch=True))
        chessboard_gui_boxlayout.add_widget(repertoire_boxlayout)
        self.add_widget(chessboard_gui_boxlayout)

class SplitterGui(BoxLayout):
    def __init__(self, **kwargs):
        super(SplitterGui, self).__init__(**kwargs)
        self.orientation = 'horizontal'

        # Splitter 1
        split1_boxlayout = BoxLayout(orientation='vertical')
        split1 = Splitter(sizable_from='bottom', min_size=74, max_size=1100)

        chessboard_widget = ChessBoardWidget()  

        split1.add_widget(chessboard_widget) 
        split1_boxlayout.add_widget(split1)
        s3_button = Button(text='s3', size_hint=(1, 1))
        split1_boxlayout.add_widget(s3_button)
        self.add_widget(split1_boxlayout)

        # Splitter 2
        split2 = Splitter(sizable_from='left', min_size=74, max_size=1800)
        s2_button = Button(text='s2', size_hint=(.1, 1))
        split2.add_widget(s2_button)
        self.add_widget(split2)


class ChessBoxApp(App):
    def build(self):
        return SplitterGui()


if __name__ == '__main__':
    ChessBoxApp().run()

如果需要调整棋盘和按钮的间距,直接修改spacing的数值即可,要调整按钮栏高度修改对应height参数即可。

内容的提问来源于stack exchange,提问作者Sam Quintanar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:18:04