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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:27:32