AttributeError: 'StandardFrame' object has no attribute 'tk'

AttributeError: 'StandardFrame' object has no attribute 'tk'

我正在构建一个表单,用户可以在该表单中捕获其 business/company 的详细信息,预计稍后将在程序中使用。我的表单工作得很好 - 但我对每个标签框架和其中的每个小部件分别进行了编码,我认为最好(因为大多数小部件都是彼此标准的)而不是将它们设置为 类。

所以在程序的主要部分,我设置了 window、第一帧和第一个条目小部件及其相关标签,如下所示:

# Set up the Main Window
set_up_window = tk.Tk()

# Basic Business Details Label Frame
basic_details_frame = StandardFrame(set_up_window, "Basic Business Details")

# Trading Name
trading_name = StandardEntry1LineWide(basic_details_frame, "Trading Name:", 0, client_data_list[0])

关联的类如下:

class StandardFrame:
def __init__(self, master, title):
    self.frame = tk.LabelFrame(master, text=title)
    self.frame.grid(column=0, row=2, padx=10, pady=10, ipadx=10, sticky="nesw")
    self.frame.grid_columnconfigure(0, weight=1, minsize=250)
    self.frame.grid_columnconfigure(1, weight=3)
    self.frame.grid_columnconfigure(2, weight=3)


class StandardEntry1LineWide:
def __init__(self, master, label_text, row, pre_pop_data):
    self.label = tk.Label(master, text=label_text, font=('​Helvetica', 11, 'bold'))
    self.label.grid(column=0, row=row, sticky="w")
    self.entry = tk.Text(master, height=1, font=('​Helvetica', 10, 'normal'))
    self.entry.insert(tk.END, pre_pop_data)
    self.entry.grid(column=1, row=row, columnspan=2, sticky="nesw", padx=10)
    self.entry.bind("<Tab>", self.MovetoNextField)

def MovetoNextField(self, event):
    event.widget.tk_focusNext().focus()
    return "break"

当我调试程序时,标签框架似乎没有问题,但当我尝试构建第一个条目小部件时,我收到以下错误:

Traceback (most recent call last):
  File "C:\Users826\PycharmProjects\pythonProject\ERP System\StartWindowModule.py", line 29, in 
    CheckClientData CompanyInfoFormV2.FormBuilder(ClientDataList, FirstTimeEntry)
  File "C:\Users826\PycharmProjects\pythonProject\ERP System\CompanyInfoFormV2.py", line 132, in 
    FormBuilder trading_name = StandardEntry1LineWide(basic_details_frame, "Trading Name:", 0, 
    client_data_list[0])
  File "C:\Users826\PycharmProjects\pythonProject\ERP System\CompanyInfoFormV2.py", line 25, in 
    __init__ self.label = tk.Label(master, text=label_text, font=('​Helvetica', 11, 'bold'))
  File "C:\Users826\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 3144, in 
    __init__ Widget.__init__(self, master, 'label', cnf, kw)
  File "C:\Users826\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 2562, in 
    __init__ BaseWidget._setup(self, master, cnf)
  File "C:\Users826\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 2531,  
    _setup self.tk = master.tk
  AttributeError: 'StandardFrame' object has no attribute 'tk'

我已经修补了大约一个小时,但似乎无法修复它 - 有人可以帮忙吗?

StandardFrame 不是 tkinter 容器(即 FrameToplevel 等),因此它可以用作其他小部件的父级。所以下面一行:

trading_name = StandardEntry1LineWide(basic_details_frame, "Trading Name:", 0, client_data_list[0])

应改为:

trading_name = StandardEntry1LineWide(basic_details_frame.frame, "Trading Name:", 0, client_data_list[0])

更好的解决方案是让 StandardFrame 直接继承自 LabelFrame

class StandardFrame(tk.LabelFrame):
    def __init__(self, master, title):
        super().__init__(master, text=title)
        self.grid(column=0, row=2, padx=10, pady=10, ipadx=10, sticky="nesw")
        self.grid_columnconfigure(0, weight=1, minsize=250)
        self.grid_columnconfigure(1, weight=3)
        self.grid_columnconfigure(2, weight=3)