Tkinter MVC架构下调用setLabel修改Label失败问题排查
错误原因与修正方案
错误原因
- 实例方法调用方式错误:
setLabel是MainPage的实例方法,必须通过类的实例对象调用,而非类本身。你用MainPage.setLabel(MainPage, ...)的写法,是把MainPage类本身当作self参数传入,但voltageLabel是在实例的__init__方法中定义的属性,类本身并不具备这个属性,因此触发AttributeError。 - 未复用已创建的实例:在
View的__init__方法中,你已经完成了MainPage实例的创建,并将其存储在self.frames[MainPage]字典中,完全可以直接使用这个现成的实例,无需再操作类本身。
另外,你最初不传MainPage触发TypeError,是因为直接调用类的实例方法时,Python不会自动传入self参数,导致方法缺少必要的第一个参数;但本质上这种调用方式就是错误的,实例方法不该这么用。
修正方法
修改View类main方法中的调用代码,替换为获取已创建的实例并调用方法:
def main(self): data = self.controller.getData() ani = animation.FuncAnimation(f, animate, interval=250, fargs=(self.controller,data)) # 替换原来的错误调用 main_page_instance = self.frames[MainPage] main_page_instance.setLabel("Voltage", data) self.protocol("WM_DELETE_WINDOW", self.on_closing) self.mainloop()
解释:self.frames[MainPage]就是你在View初始化时创建的MainPage实例,用它调用setLabel时,Python会自动把这个实例作为self参数传入方法,你只需要传入label和value两个参数即可,完全符合方法的定义。
内容的提问来源于stack exchange,提问作者daniel castellanos
相关产品推荐
相关产品推荐

