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()
关键修改说明
- 调整父类初始化顺序:先创建布局并添加到屏幕,再初始化空按钮列表,避免布局未定义就被调用。
- 把
button_maker的调用移到子类中:子类先给btn_lst赋值,再调用生成方法,确保有按钮文本可以遍历。 - 补全
self.add_widget(self.layout):把布局挂载到屏幕上,让生成的按钮能显示出来。
内容的提问来源于stack exchange,提问作者Brian Ketelboeter
相关产品推荐
相关产品推荐

