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

Kivy按钮创建逻辑能否简化?子类继承实现遇黑屏问题求助

Kivy批量生成按钮黑屏问题分析及修复

问题原因拆解

  • 按钮列表赋值时机颠倒:父类myScreen的__init__里先调用了button_maker,但子类是在父类初始化完成后才给btn_lst赋值,导致调用button_maker时btn_lst还是空列表,根本没生成任何按钮。
  • 布局未挂载到屏幕:父类里创建了BoxLayout,但从未将这个布局添加到Screen组件中,就算按钮生成了也无法显示。
  • 布局初始化顺序错误:button_maker试图往self.layout添加按钮,但layout是在button_maker调用之后才创建的,逻辑上存在调用顺序问题(只是因为btn_lst为空没触发报错)。

修复后的代码

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

class myScreen(Screen):
    def __init__(self, **kwargs):
        super(myScreen, self).__init__(**kwargs)
        # 先初始化布局并挂载到屏幕
        self.layout = BoxLayout(padding=5, orientation='vertical')
        self.add_widget(self.layout)
        # 初始化空按钮列表
        self.btn_lst = []

    def button_maker(self):
        print('生成按钮中')
        for btn_text in self.btn_lst:
            butn = Button(text=btn_text)
            self.layout.add_widget(butn)

class LogInMenu(myScreen):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        self.btn_lst = ['Login','Sign Up']
        # 赋值后再调用按钮生成方法
        self.button_maker()

    def CustomBtn(self,btn):
        pass

class MainMenu(myScreen):
    def __init__(self,**kwargs):
        super(MainMenu,self).__init__(**kwargs)
        self.btn_lst = ['Donations','Food','Clothing','Money','Furniture']
        # 赋值后再调用按钮生成方法
        self.button_maker()

    def CustomBtn(self,btn):
        pass

class BaseApp(App):
    def build(self):
        sm= ScreenManager()
        sm.add_widget(LogInMenu(name ='login'))
        sm.add_widget(MainMenu(name = 'main'))
        return sm   

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

关键修改说明

  1. 调整父类初始化顺序:先创建布局并添加到屏幕,再初始化空按钮列表,避免布局未定义就被调用。
  2. 把button_maker的调用移到子类中:子类先给btn_lst赋值,再调用生成方法,确保有按钮文本可以遍历。
  3. 补全self.add_widget(self.layout):把布局挂载到屏幕上,让生成的按钮能显示出来。

内容的提问来源于stack exchange,提问作者Brian Ketelboeter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:37:38