Python:Tk.Toplevel开发之’NoneType’ object has no attribute ‘children’
在使用Tkinter进行UI开发时,经常会用到多窗体的跳转,我们可以使用Tkinter.Toplevel进行子窗体的创建和跳转。在调试时,出现了’NoneType’ object has no attribute 'children’的错误提示。源代码如下:
import tkinter as tk
from GALAD详情 import TableDisplayApp
class LiverCancerRiskAssessment(tk.Toplevel):
def __init__(self,master=None):
super().__init__(master)
self.title("Liver Cancer Risk Assessment")
# 初始化其他组件和事件绑定
self.master = master
# 假设您有一个按钮和相应的事件处理函数
self.button = tk.Button(self, text="Click Me", command=self.on_button_click)
self.button.pack()
self.asap_result = tk.StringVar()
self.asap_result_label = tk.Label(self, textvariable=self.asap_result)
self.asap_result_label.pack()
def on_button_click(self):
print("Button clicked!")
self.button.config(text="新标题")
self.asap_result.set("请输入有效数值")
self.update_idletasks()
TableDisplayApp()
class Login(tk.Tk):
def __init__(self):
super().__init__()
self.title("Login")
# 初始化登录组件
# 登录成功后打开新窗口的按钮
self.open_button = tk.Button(self, text="Open Assessment", command=self.open_assessment)
self.open_button.pack()
self.asap_result = tk.StringVar()
self.asap_result_label = tk.Label(self, textvariable=self.asap_result)
self.asap_result_label.pack()
def open_assessment(self):
# 不要销毁当前窗口,除非您确定要关闭它
# self.view.destroy()
self.open_button.config(text="新标题")
self.asap_result.set("请输入有效数值")
# 创建新窗口的实例并启动事件循环
assessment = LiverCancerRiskAssessment()
assessment.mainloop()
# 程序入口点
if __name__ == "__main__":
login = Login()
login.mainloop()
是什么问题产生了这个错误呢?
问题的解决:
通义千问的回答是这样的:这个错误提示表明某个地方尝试访问一个NoneType对象的children属性。这通常意味着您尝试在一个尚未正确初始化或者已经被销毁的窗口对象上调用操作。结合上下文,这可能是因为您尝试从Login类中打开LiverCancerRiskAssessment时传递了错误的master参数。实际上,在创建LiverCancerRiskAssessment实例时,由于Login类已经是顶级窗口(继承自tk.Tk),您不需要再传入master,应直接使用默认值(即None)。
但是问题就是出现这里,而且在调试的过程中发现,关闭子窗体后,主窗体不能关闭,必须点击停止调试才能结束程序。最后将代码中的assessment = LiverCancerRiskAssessment()修改为:assessment = LiverCancerRiskAssessment(self),TableDisplayApp()修改为:TableDisplayApp(self)后,错误提示就消失了。所以这里的错误提示:Tkinter.Toplevel的类在构建时必须显示地声明父窗体,也就是master,如果没有声明,就会出现’NoneType’ object has no attribute 'children’的错误提示。