KivyMD应用重启触发layout.kv重复加载告警的解决方法
KivyMD应用重启时kv文件重复加载警告问题
报错信息
[INFO ] [Base ] Leaving application in progress... [WARNING] [Lang ] The file e:\school_proj\final_with_settings\layout.kv is loaded multiples times, you might have unwanted behaviors. [INFO ] [Base ] Start application main loop False True UPDATED [INFO ] [Base ] Leaving application in progress...
场景说明
需要在获取用户输入修改配置后重启应用,让新配置生效,最初编写的重启代码如下:
def restart(self): self.root.clear_widgets() self.stop() return StonkkApp().run()
原始完整代码
class StonkkApp(MDApp): def build(self): self.icon = f'{cur_file_path}/stonkss.png' screen = Builder.load_file('layout.kv') self.theme_cls.theme_style = theme self.theme_cls.primary_palette = 'Gray' return screen def restart(self): self.root.clear_widgets() self.stop() return StonkkApp().run()
完整运行日志
Full Traceback: [INFO ] [deps ] Successfully imported "kivy_deps.gstreamer" 0.3.2 [INFO ] [deps ] Successfully imported "kivy_deps.angle" 0.3.0 [INFO ] [deps ] Successfully imported "kivy_deps.glew" 0.3.0 [INFO ] [deps ] Successfully imported "kivy_deps.sdl2" 0.3.1 [INFO ] [Kivy ] v2.1.0.dev0, git-143ba31, 20210630 [INFO ] [Python ] v3.9.6 (tags/v3.9.6:db3ff76, Jun 28 2021, 15:26:21) [MSC v.1929 64 bit (AMD64)] [INFO ] [Logger ] Purge log fired. Processing... [INFO ] [Logger ] Purge finished! [INFO ] [Factory ] 189 symbols loaded [INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_pil (img_ffpyplayer ignored) [INFO ] [Text ] Provider: sdl2 [INFO ] [Window ] Provider: sdl2 [INFO ] [GL ] Using the "OpenGL" graphics system [INFO ] [GL ] GLEW initialization succeeded [INFO ] [GL ] Backend used <glew> [INFO ] [GL ] OpenGL version <b'4.5.13399 Compatibility Profile Context 15.201.1151.1008'> [INFO ] [GL ] OpenGL vendor <b'ATI Technologies Inc.'> [INFO ] [GL ] OpenGL parsed version: 4,5 [INFO ] [GL ] Shading version <b'4.40'> [INFO ] [GL ] Texture max size <16384>[INFO ] [GL ] Texture max units <18> [INFO ] [Window ] auto add sdl2 input provider [INFO ] [Window ] virtual keyboard not allowed, single mode, not docked [INFO ] [GL ] NPOT texture support is available [INFO ] [Base ] Start application main loop False True UPDATED Saving changes. current color and type of plot is , . app mode is Light [INFO ] [Base ] Leaving application in progress... [WARNING] [Lang ] The file e:\school_proj\final_with_settings\layout.kv is loaded multiples times, you might have unwanted behaviors. [INFO ] [Base ] Start application main loop False True UPDATED [INFO ] [Base ] Leaving application in progress...
问题原因
Kivy的Builder模块加载kv文件时会将解析结果缓存到内存中,重启应用时新创建的App实例再次调用Builder.load_file('layout.kv'),就会检测到同一个kv文件已经被加载过,触发重复加载警告,严重时会导致控件绑定失效、样式异常等问题。
解决方法
在重启方法的最开头先卸载已经加载的kv文件即可,修改后的代码如下:
from kivy.lang import Builder class StonkkApp(MDApp): def build(self): self.icon = f'{cur_file_path}/stonkss.png' screen = Builder.load_file('layout.kv') self.theme_cls.theme_style = theme self.theme_cls.primary_palette = 'Gray' return screen def restart(self): # 卸载已加载的kv文件,避免重复加载 Builder.unload_file('layout.kv') self.root.clear_widgets() self.stop() return StonkkApp().run()
注意事项
unload_file的参数要和load_file时传入的路径、大小写完全一致,避免因为匹配失败导致卸载失效- 如果是通过Kivy默认规则自动加载的kv文件,建议改为手动调用
load_file加载,方便控制卸载逻辑 - 若重启后仍有资源残留异常,可在
self.stop()后添加少量延迟(如time.sleep(0.1))等待资源释放,大部分场景下无需额外添加
内容的提问来源于stack exchange,提问作者I3lackI3uck
相关产品推荐
相关产品推荐

