如何控制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
相关产品推荐
相关产品推荐

