Kivy开发双屏应用调用id报AttributeError解决方法及学习书籍推荐
问题原因
你遇到的AttributeError是因为SecondWindow的__init__方法执行时,KV文件中定义的UI组件还未完成初始化,ids字典还没有绑定对应的组件,所以无法获取到box这个ID对应的对象。
正确调用id为box的组件的方案
方案1:重写Screen的on_enter方法
on_enter是Screen类的内置方法,会在当前屏幕第一次被切换显示、组件完全初始化完成后触发,此时ids已经完成绑定,可以正常调用:
class SecondWindow(Screen): def __init__(self, **kwargs): super().__init__(**kwargs) # 和UI无关的初始化逻辑可以放在这里 def on_enter(self, *args): # 绘图和操作box的逻辑移到此处 x = [1, 2, 3, 4, 5] y = [5, 12, 6, 9, 15] plt.plot(x, y) plt.ylabel("This is MY Y Axis") plt.xlabel("X Axis") box = self.ids.box box.add_widget(FigureCanvasKivyAgg(plt.gcf()))
方案2:用Clock延迟执行操作
如果你需要在初始化阶段就操作组件,可以用Clock.schedule_once把操作延迟到下一帧,等组件初始化完成后再执行:
from kivy.clock import Clock class SecondWindow(Screen): def __init__(self, **kwargs): super().__init__(**kwargs) Clock.schedule_once(self.init_ui, 0) # 参数0代表下一帧立即执行 def init_ui(self, dt): x = [1, 2, 3, 4, 5] y = [5, 12, 6, 9, 15] plt.plot(x, y) plt.ylabel("This is MY Y Axis") plt.xlabel("X Axis") box = self.ids.box box.add_widget(FigureCanvasKivyAgg(plt.gcf()))
Kivy相关优质学习书籍推荐
- 《Kivy - Interactive Applications and Games in Python》:内容由浅入深,覆盖Kivy基础组件、事件处理、动画、跨平台打包等核心知识点,配套多个实操项目,适合新手入门
- 《Kivy Blueprints》:包含多个不同类型的实战项目,适合已经掌握基础的开发者提升实际开发能力,其中跨平台适配、性能优化相关内容实用性很强
- 《Creating Apps in Kivy》:面向完全零基础的学习者,步骤非常详细,覆盖从环境搭建到完整APP开发打包的全流程
内容的提问来源于stack exchange,提问作者Misha Pakhomov
相关产品推荐
相关产品推荐

