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

Kivy应用启动时调用绘图函数报错:'NoneType'对象无get_screen属性

问题解决:启动时调用绘图函数触发AttributeError

错误原因

  1. 实例未关联ScreenManager:你在on_start里直接mw = MainWindow()新建了一个MainWindow实例,但这个实例根本没被加入到应用的ScreenManager中,所以它的self.manager是None,调用get_screen自然报错。而按钮点击时调用的是已经被ScreenManager管理的那个MainWindow实例,所以能正常运行。
  2. 代码冗余导致不必要调用:你在Allgemeinepunkte里写的self.manager.get_screen("main")完全多余——当前函数就在MainWindow类里,self就是那个名为"main"的屏幕实例,直接用self.ids.Graph就行。

修复代码

1. 修改应用类的on_start方法

不要新建实例,从已有的ScreenManager中获取MainWindow:

class MyMainApp(App):
    def build(self):
        Window.clearcolor = (0.08,0.12,0.17,1)
        kv = Builder.load_file("my.kv")
        return kv

    def on_start(self, **kwargs):
        # 从根部件(ScreenManager)获取已存在的main屏幕实例
        mw = self.root.get_screen("main")
        mw.Allgemeinepunkte()

2. 简化Allgemeinepunkte函数的冗余代码

class MainWindow(Screen):
    def Allgemeinepunkte(self, *args):
        print("nice")
        # 直接用self.ids,不用绕manager.get_screen
        self.ids.Graph.clear_widgets()
        global Alist 
        with open ('Allgemein.txt', 'r') as m:
            Alist = m.read().splitlines()

        Alist = [int(item) for item in Alist]

        AAnzahlNoten = list(range(1, len(Alist)+1))  # 简化循环写法

        plt.clf()
        plt.plot(AAnzahlNoten, Alist)
        plt.tight_layout() 
        self.ids.Graph.add_widget(FigureCanvasKivyAgg(plt.gcf()))

关键说明

  • 应用启动后,self.root就是你从kv文件加载的ScreenManager,通过get_screen("main")能拿到已经被管理的MainWindow实例,这个实例的manager属性是有效的。
  • 把AAnzahlNoten的循环改成range(1, len(Alist)+1),代码更简洁,效果完全一致。

内容的提问来源于stack exchange,提问作者Deimos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:50:26