继承Tkinter的Frame类的自定义Food类返回NoneType实例的原因及解决方法
问题原因与修复方案
产生原因
- Tkinter内置的三类布局方法
pack()、grid()、place()的返回值固定为None,你代码中使用的链式调用Food(root,1).pack(fill='x'),最终获取的是pack()方法的返回值,而非前面创建的Food类实例。 - 自定义的Food类本身逻辑没有问题,错误完全来自调用逻辑。
修复方法
将实例创建和布局调用拆分为两个独立步骤,先存储Food实例再调用布局方法即可:
import tkinter as tk class Food(tk.Frame): def __init__(self,parent,index,name="",price=0): tk.Frame.__init__(self, parent) self.name = tk.Entry(self) self.price = tk.Entry(self) self.name.insert(0, name) self.price.insert(0, str(price)) self.name.pack(ipadx=70,ipady=5,side='left',expand=True, fill='x') self.price.pack(ipadx=10,ipady=5,side='left') self.index=index def getIndex(self): return self.index if __name__ == "__main__": root = tk.Tk() # 先创建实例并存储引用 food_item = Food(root,1) # 再单独调用布局方法 food_item.pack(fill='x') # 此时可正常获取Food类实例 print(type(food_item)) # 输出 <class '__main__.Food'> root.mainloop()
注意事项
所有Tkinter组件(含自定义继承的组件)都不要使用组件实例().布局方法()的链式写法,会直接丢失实例引用,必须拆分执行。
内容的提问来源于stack exchange,提问作者Timur Khr
相关产品推荐
相关产品推荐

