AttributeError: window对象无tk属性问题求助(Tkinter多窗口程序)
解决Tkinter多窗口程序的AttributeError问题
错误原因分析
- 类继承与初始化错误:你的
window类继承自Toplevel,但在__init__里又创建了新的tk.Tk()实例。Toplevel是依赖主窗口的子窗口,不能在其内部创建主窗口;且继承Toplevel后未调用父类初始化方法,导致缺失tk属性触发报错。 - 方法缺失与调用错误:
MainWindow里声明了command=self.open_save_record_window但未实现该方法;同时self.title调用错误,MainWindow不是Tk窗口子类,需通过self.master调用窗口标题。 - 主程序入口逻辑错误:应先创建主
Tk窗口实例,再传入MainWindow,而非用自定义window类作为根窗口。
修正后的代码
import tkinter as tk from tkinter import Button class AddCustomerWindow(tk.Toplevel): def __init__(self, master=None): # 调用父类Toplevel的初始化方法,传入主窗口作为依赖 super().__init__(master) self.title("Add Customer Record") self.geometry("500x400") # 可在此添加子窗口控件示例 tk.Label(self, text="Customer Information Form").pack(pady=20) class MainWindow: def __init__(self, master=None): self.master = master # 通过master对象设置主窗口标题 self.master.title("Shopping Mall Management") self.master.geometry("500x300") # 绑定打开子窗口的方法 Button(self.master, text="Add customer record", command=self.open_save_record_window).pack(pady=20) def open_save_record_window(self): # 创建子窗口,传入主窗口作为父容器 AddCustomerWindow(self.master) # 主程序入口:先创建根Tk窗口 root = tk.Tk() main_app = MainWindow(root) root.mainloop()
关键修改点
- 重命名
window类为AddCustomerWindow(语义更清晰),并通过super().__init__(master)正确初始化父类,确保继承Toplevel的所有必要属性。 - 移除子窗口内多余的
tk.Tk()创建,让子窗口直接依附传入的主窗口。 - 补全
MainWindow中的open_save_record_window方法,负责触发子窗口的创建。 - 调整主程序逻辑:先创建主
tk.Tk()实例,再初始化MainWindow,保证窗口层级关系正确。
内容的提问来源于stack exchange,提问作者Khilesh Chauhan
相关产品推荐
相关产品推荐

