You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AttributeError: window对象无tk属性问题求助(Tkinter多窗口程序)

解决Tkinter多窗口程序的AttributeError问题

错误原因分析

  1. 类继承与初始化错误:你的window类继承自Toplevel,但在__init__里又创建了新的tk.Tk()实例。Toplevel是依赖主窗口的子窗口,不能在其内部创建主窗口;且继承Toplevel后未调用父类初始化方法,导致缺失tk属性触发报错。
  2. 方法缺失与调用错误:MainWindow里声明了command=self.open_save_record_window但未实现该方法;同时self.title调用错误,MainWindow不是Tk窗口子类,需通过self.master调用窗口标题。
  3. 主程序入口逻辑错误:应先创建主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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:50:04