Kivy添加MDBottomNavigation后触发Clock迭代超限警告的原因咨询
正在学习Kivy框架,为实现保存数据、清除绘图内容及返回主页功能,在kv文件中添加MDBottomNavigation组件后,出现警告:
Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
未添加该组件时程序运行正常,对应的kv代码如下:
BoxLayout: size_hint: None, None size: area_img.size pos_hint: {'center_x': .5, 'center_y': .5} Court: id: area_img source: 'half-court.png' size: self.texture_size MDBottomNavigation: MDBottomNavigationItem: name: "btnSave" text: "Save" icon: "images/save.png" selected_color_background: 147/255,84/255,48/255 on_tab_release: root.show_save() MDBottomNavigationItem: name: "btnClear" text: "Clear Screen" icon: "images/clear.png" selected_color_background: 147/255,84/255,48/255 on_tab_release: root.clear_drawing() MDBottomNavigationItem: name: "btnBack" text: "Home" icon: "images/home.png" selected_color_background: 147/255,84/255,48/255 # on_tab_release: app.root.current = 'main'
问题原因
这个警告的核心是布局尺寸计算出现循环依赖:你的BoxLayout把自身size绑定到子组件area_img的size,但同时BoxLayout还包含了MDBottomNavigation。添加导航组件后,它的尺寸会改变BoxLayout的总尺寸,而BoxLayout的尺寸变化又会反向影响area_img的布局,形成无限循环的尺寸计算,导致Clock迭代次数超过默认上限。
解决方案
方案1:分离绘图区域与底部导航(推荐)
把MDBottomNavigation移出当前BoxLayout,用外层布局垂直包裹绘图区和导航栏,彻底打破循环:
BoxLayout: orientation: 'vertical' # 绘图区域占90%高度 BoxLayout: size_hint: 1, 0.9 Court: id: area_img source: 'half-court.png' size: self.texture_size size_hint: None, None pos_hint: {'center_x': .5, 'center_y': .5} # 底部导航占10%高度 MDBottomNavigation: size_hint: 1, 0.1 MDBottomNavigationItem: name: "btnSave" text: "Save" icon: "images/save.png" selected_color_background: 147/255,84/255,48/255 on_tab_release: root.show_save() MDBottomNavigationItem: name: "btnClear" text: "Clear Screen" icon: "images/clear.png" selected_color_background: 147/255,84/255,48/255 on_tab_release: root.clear_drawing() MDBottomNavigationItem: name: "btnBack" text: "Home" icon: "images/home.png" selected_color_background: 147/255,84/255,48/255 # on_tab_release: app.root.current = 'main'
方案2:修改尺寸绑定逻辑
如果要保留原布局结构,给BoxLayout设置独立的尺寸计算规则,不再依赖area_img的尺寸:
BoxLayout: size_hint: None, None # 基于父容器尺寸设置,避免循环 size: root.width, root.height * 0.9 pos_hint: {'center_x': .5, 'center_y': .5} Court: id: area_img source: 'half-court.png' size: self.texture_size size_hint: None, None pos_hint: {'center_x': .5, 'center_y': .5} MDBottomNavigation: size_hint: 1, 0.1 # 导航项代码不变
方案3:临时提高Clock迭代上限(不推荐)
如果只是临时测试,可以在Python代码中调高迭代上限,但这只是治标不治本,无法解决布局循环问题:
from kivy.clock import Clock Clock.max_iteration = 20 # 默认值为10,适当提高
内容的提问来源于stack exchange,提问作者anotha one
相关产品推荐
相关产品推荐

