Python использование super () для наследования - PullRequest
0 голосов
/ 29 января 2020

Предположим, у меня есть 2 файла: frontend.py для отображения GUI и backend.py для функций базы данных. У меня проблема с наследованием класса базы данных с помощью super (). из # backend2.py в классе managerPage в # frontend.py

У меня ошибка:

frame = F (container, self) TypeError: init () отсутствует 2 обязательных позиционных аргумента: 'cn' и 'cur'

Я считаю, что это связано с init в классе tk.Frame, который я также унаследовал в классе managerPage. Я считаю, что класс selfService (который я переименовал для себя) зачислен пользователю @BryanOakley. Может ли кто-нибудь, пожалуйста, помогите мне успешно использовать super ().

frontend.py.

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)

backend2.py

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()

1 Ответ

0 голосов
/ 29 января 2020

Наследование не для обмена данными между двумя разными объектами. Ваш 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. Один или другой, но не оба).

...