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 容器(即 Frame
、Toplevel
等),因此它可以用作其他小部件的父级。所以下面一行:
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)
我正在构建一个表单,用户可以在该表单中捕获其 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 容器(即 Frame
、Toplevel
等),因此它可以用作其他小部件的父级。所以下面一行:
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)