KivyMD初始化MDTextField部件触发ValueError报错问题咨询
报错原因
你触发该错误的核心原因是在MDApp实例初始化完成之前,就提前实例化了包含KivyMD组件的SettingsScreen、MenuScreen部件。KivyMD所有MD开头的组件,都依赖已初始化完成的MDApp实例才能正常加载,你当前的代码执行顺序是先在全局作用域实例化Screen、添加到ScreenManager,之后才创建DemoApp实例,执行顺序完全不符合KivyMD的要求。
修复方案
- 把ScreenManager的实例化、Screen的添加逻辑,移动到DemoApp的build方法内部,不要在全局作用域提前执行。
- 你原代码还存在一个额外逻辑错误:
profileinfo.add_widget(profileinfo)是将部件自身添加到自身,会触发递归报错,需要删除。
修复后完整代码参考:
from kivymd.app import MDApp from kivymd.uix.screen import MDScreen, Screen from kivymd.uix.boxlayout import MDBoxLayout from kivy.uix.screenmanager import ScreenManager # 其余依赖如FitImage、EffectWidget、FitImageButton等导入自行补全 class SettingsScreen(Screen): def __init__(self, **kwargs): super().__init__(**kwargs) self.scr = MDScreen() box = MDBoxLayout(orientation='vertical', padding=['10dp', '30dp', '10dp', '50dp']) imagebox = MDBoxLayout(size=(350,350), size_hint=(None,None), pos_hint={'center_x':.5}) blur = EffectWidget() blur.add_widget(FitImage(source='makeblur.png')) blur.effects =[HorizontalBlurEffect(size=10), VerticalBlurEffect(size=10)] profpic = FitImageButton(source='prof.png', radius=[250, 0], on_release=self.iii) self.scr.add_widget(blur) imagebox.add_widget(profpic) box.add_widget(imagebox) box.add_widget(Widget(size_hint=(None, None), height='25dp')) username = Label(text='name', font_name='bebas-neue-bold.ttf', size_hint_y=None, height=5) box.add_widget(username) box.add_widget(MDBoxLayout(size_hint=(None,None))) profileinfo = MDScreen(md_bg_color=[1,1,1,1]) profileinfo.add_widget(Label(size_hint=(.5, .1), pos_hint={"center_x":.6, "center_y":.8}, text='www')) profileinfo.add_widget(Label(text='Contact Data', color=[.1,.1,.1,1], pos=(-300,465), font_name='bebas-neue-bold.ttf')) profileinfo.add_widget(Label(text='Email', color=[.1,.1,.1,1], pos=(-330,345), font_name='bebas-neue-bold.ttf')) # 已删除递归添加的错误代码 self.scr.add_widget(box) self.add_widget(profileinfo) def iii(self, *args): print('www') selectimage = MDBoxLayout(md_bg_color=[1, 1, 1, 1], orientation='vertical') def change_screen(self, event): self.manager.transition.direction = 'right' self.manager.current = 'menu' class MenuScreen(Screen): # 你自己的MenuScreen逻辑保留即可 pass class DemoApp(MDApp): def build(self): # Screen相关初始化逻辑移到build方法,保证MDApp已完成初始化 sm = ScreenManager() sm.add_widget(MenuScreen(name='menu')) sm.add_widget(SettingsScreen(name='settings')) return sm DemoApp().run()
注意事项
所有涉及KivyMD组件的实例化操作,都要放在MDApp实例初始化之后执行,不要放在全局作用域。
内容的提问来源于stack exchange,提问作者KryptonH
相关产品推荐
相关产品推荐

