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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:06:03