Python Kivy开发中Widget内按钮未显示问题求助
问题根因
界面不显示按钮是两个问题导致的:
LoopButton本身已经继承自BoxLayout,你在build方法中新建了一个独立的BoxLayout实例存放按钮,但调用self.build()时仅拿到了返回的布局对象,没有将这个对象添加到LoopButton自身的控件树中,未被挂载的控件不会参与界面渲染。- 导入语句存在错误:
Label属于kivy.uix.label模块,并不在kivy.uix.button下,当前代码虽未用到Label不会触发报错,但属于无效导入。
修复方式
因为LoopButton本身就是布局容器,不需要额外嵌套一层BoxLayout,最简洁的改法是直接将按钮添加到当前实例上:
from kivy.app import App from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout class LoopButton(BoxLayout): def __init__(self, **kwargs): super(LoopButton , self).__init__(**kwargs) self.orientation = 'vertical' self.build() def build(self): btn1 = Button(text='Hello') btn2 = Button(text='World') self.add_widget(btn1) self.add_widget(btn2) class TestApp(App): def build(self): return LoopButton() if __name__ == '__main__': TestApp().run()
如果你确实要保留build方法返回独立布局的写法,只需要在__init__中把返回的布局添加到自身即可:
from kivy.app import App from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout class LoopButton(BoxLayout): def __init__(self, **kwargs): super(LoopButton , self).__init__(**kwargs) inner_layout = self.build() self.add_widget(inner_layout) def build(self): layout = BoxLayout(orientation='vertical') btn1 = Button(text='Hello') btn2 = Button(text='World') layout.add_widget(btn1) layout.add_widget(btn2) return layout class TestApp(App): def build(self): return LoopButton() if __name__ == '__main__': TestApp().run()
第二种写法会多一层不必要的布局嵌套,渲染性能略差,非特殊需求不推荐使用。
内容的提问来源于stack exchange,提问作者ahmed omran
相关产品推荐
相关产品推荐

