Kivy代码运行未在屏幕生成预期范围按钮的问题咨询
问题根源
你的代码存在两个核心问题,导致无法正常展示多个按钮:
- 自定义布局没有被设为App根控件:Kivy的App如果不重写
build()方法返回根布局实例,会默认查找和App类名匹配的kv规则/根控件。你的App名为TheLabApp,和自定义的Stacklayout类名不匹配,因此写在Stacklayout.__init__里循环创建按钮的逻辑根本不会执行,界面不会加载你创建的按钮。 - 按钮尺寸参数设置错误:就算正确加载了布局,你给所有按钮设置
size_hint=(1,1),意味着每个按钮的宽高都会占满父布局的全部可用空间,10个按钮会完全重叠堆叠,最终只能看到最顶层的1个按钮,达不到展示多个按钮的效果。
修复方法
- 重写
TheLabApp的build()方法,返回自定义的布局实例,明确指定App的根布局 - 调整按钮的
size_hint参数,不要让单个按钮占满整个布局空间,按需设置尺寸即可,比如要实现横向自动换行排列,可以给按钮设置比例宽度+固定高度 - 注:自定义布局类名尽量不要和导入的原生控件名近似,避免大小写混淆导致引用错误
修复后可运行代码
from kivy.app import App from kivy.uix.button import Button from kivy.uix.stacklayout import StackLayout from kivy.metrics import dp class ButtonStackLayout(StackLayout): def __init__(self, **kwargs): super().__init__(**kwargs) for i in range(10): # 宽度占父布局20%(一行刚好排5个),高度设为固定100dp适配不同屏幕密度 btn = Button(text=f"bruh {i}", size_hint=(0.2, None), height=dp(100)) self.add_widget(btn) class TheLabApp(App): def build(self): return ButtonStackLayout() if __name__ == "__main__": TheLabApp().run()
运行后10个按钮会按照StackLayout默认的从左到右规则排列,满一行自动换行,所有按钮均可正常显示点击。
内容的提问来源于stack exchange,提问作者Subham Rai
相关产品推荐
相关产品推荐

