假设我有2个文件,用于显示GUI的frontend.py和用于数据库功能的backend.py。我在使用super()继承数据库类时遇到问题。来自#frontend.py
的managerPage类中的#backend2.py我有错误:
frame = F(容器,自身) TypeError: init ()缺少2个必需的位置参数:“ cn”和“ cur”
我相信这与tk.Frame类中的 init 有关,我也已经在managerPage类中继承了该类。我相信selfService类(已为我自己重新命名)归功于用户@BryanOakley。有人可以帮助我成功利用super()。
import backend2
class selfService(tk.Tk, Toplevel):
def __init__(self, *args, **kwargs):
#Toplevel.__init__(self)
self.employeeWindow = None
tk.Tk.__init__(self, *args, **kwargs)
self.container = tk.Frame(self)
self.container.pack(side="top", fill="both",
expand = True)
self.container.grid_rowconfigure(0,
weight=1)
self.container.grid_columnconfigure(0,
weight=1)
self.frames = {}
selfService.restart = False
for F in (StartPage, PageOne, PageTwo):
self.frame = F(self.container, self)
self.frames[F] = self.frame
self.frame.grid(row=0, column=0,
sticky="nsew")
self.show_frame(StartPage)
def show_frame(self, cont):
self.frame = self.frames[cont]
self.frame.tkraise()
class managerPage(tk.Frame,
validation.account_validation,backend2.Database):
def __init__(self, parent, controller, cn, cur):
tk.Frame.__init__(self,parent)
super().__init__(cn, cur)
print(self.cn)
class Database():
def __init__(self):
self.config = {
'user': 'root',
'password': 'root',
'host': 'localhost',
'database': 'myDatabase'}
self.cn =
mysql.connector.connect(**self.config)
self.cur = self.cn.cursor()
答案 0 :(得分:0)
继承不是用于在两个不同对象之间共享数据。您的managerPage
不应继承数据库类。该页面不能同时是一个页面和一个数据库。如果您使用继承,则每个实例将是数据库的一个单独实例。
相反,您应该创建Database
类的单个实例,并将该实例传递给需要它的页面。那样,或者在控制器上添加一个可以返回实例的方法。
例如,您可以在控制器的__init__
中创建数据库实例:
class selfService(tk.Tk):
def __init__(self, *args, **kwargs):
...
self.db = Database()
...
然后,在任何引用控制器的代码中,您都可以使用self.controller.db
访问数据库,如以下示例所示:
class managerPage(tk.Frame):
def __init__(self, parent, controller):
self.controller = controller
...
print(self.controller.db)
(请注意,您不应继承Tk
和 Toplevel
。一个或另一个,但不能同时继承)。