Kivy应用启动时调用绘图函数报错:'NoneType'对象无get_screen属性
问题解决:启动时调用绘图函数触发AttributeError
错误原因
- 实例未关联ScreenManager:你在
on_start里直接mw = MainWindow()新建了一个MainWindow实例,但这个实例根本没被加入到应用的ScreenManager中,所以它的self.manager是None,调用get_screen自然报错。而按钮点击时调用的是已经被ScreenManager管理的那个MainWindow实例,所以能正常运行。 - 代码冗余导致不必要调用:你在
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
相关产品推荐
相关产品推荐

