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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:48:01