如何判断Tkinter Toplevel组件是否存在?解决属性未定义报错
解决Tkinter中创建Toplevel前销毁已有实例的报错问题
你遇到的object has no attribute 'toplevel'错误,核心原因是第一次点击按钮时self.toplevel还没被定义,直接调用winfo_exists自然会找不到这个属性。
不用try/except的话,最优方案是提前初始化这个属性,再结合winfo_exists做双重判断:
- 在类的
__init__方法里先把self.toplevel初始化为None,确保属性从一开始就存在; - 在
makeToplevel中先判断self.toplevel是否有效(不为None且窗口仍存在),再执行销毁操作。
修改后的完整代码如下:
# does_widger_exists.py import tkinter as tk class TL_GUI: def __init__(self): self.root = tk.Tk() self.root.geometry('300x100') self.root.title('Tkinter Test') # 提前初始化toplevel属性为None self.toplevel = None button0 = tk.Button(self.root,text='Create Toplevel',command=self.makeToplevel).pack(pady=20) self.root.mainloop() def makeToplevel(self): # 先判断toplevel是否存在且窗口仍有效 if self.toplevel is not None and self.toplevel.winfo_exists(): self.toplevel.destroy() self.toplevel = tk.Toplevel(self.root) self.toplevel.geometry('500x100') self.toplevel.title('I am a TopLevel') text0 = tk.Label(self.toplevel,text='Hello World',height=1,width=25,borderwidth=5).pack() if __name__ == '__main__': TL_GUI()
补充说明:
winfo_exists()是Tkinter组件的实例方法,直接通过self.toplevel.winfo_exists()调用更符合Python的面向对象写法;- 先判断
self.toplevel is not None可以避免第一次执行时的属性错误,再结合winfo_exists()能处理用户手动关闭Toplevel窗口后,self.toplevel对象仍存在但窗口已销毁的情况。
内容的提问来源于stack exchange,提问作者Pragmatic_Lee
相关产品推荐
相关产品推荐

