Как я могу интегрировать свои классы в финальный класс? - PullRequest
0 голосов
/ 08 ноября 2018

В другом вопросе о структуре кода Python было предложено одно решение: Вопрос здесь можно найти: Лучший способ структурировать приложение tkinter

class Navbar(tk.Frame): ...
class Toolbar(tk.Frame): ...
class Statusbar(tk.Frame): ...
class Main(tk.Frame): ...

class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.statusbar = Statusbar(self, ...)
        self.toolbar = Toolbar(self, ...)
        self.navbar = Navbar(self, ...)
        self.main = Main(self, ...)

        self.statusbar.pack(side="bottom", fill="x")
        self.toolbar.pack(side="top", fill="x")
        self.navbar.pack(side="left", fill="y")
        self.main.pack(side="right", fill="both", expand=True)

Мне нравится решение, и я пытался воспроизвести его в крошечных масштабах, прежде чем применить его к моему коду. Может кто-нибудь помочь мне, какие аргументы, параметры отсутствуют для настройки приложения? Смотри ниже мой код:

import tkinter as tk


class Main(tk.Frame):

    def __init__(self, master):
        central = tk.Frame(master)
        central.pack(side="top", fill="both")

class SubMain(tk.Frame):

    def __init__(self,master):
        lowercentral = tk.Frame(master)
        lowercentral.pack(side="top", fill="both")

class MainApplication(tk.Frame):

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.central = Main(self)
        self.lowercentral = SubMain(self)

        self.central.pack(side="top", fill="both")
        self.lowercentral.pack(side="top", fill="both")


root = tk.Tk()
MainApplication(root).pack(side="top", fill="both")
root.mainloop()

Несколько слов к моему коду. Я ожидаю, что код просто откроет пустое белое окно. Класс Main и SubMain должны создать два кадра. MainApplication должен объединять оба класса и эффективно действовать как центр всех классов.

Однако я получаю сообщение об ошибке:

AttributeError: «Главный» объект не имеет атрибута «tk»

Я предполагаю, что, как и в моем примере, я пропускаю параметры в функции init MainApplication, но мои варианты не дали никакого успеха.

Может ли кто-нибудь помочь мне с этим?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Обязательно вызовите super().__init__() во всех ваших __init__ функциях. Они отсутствуют в Main и SubMain.

0 голосов
/ 08 ноября 2018

Прежде всего, когда вы создаете экземпляры классов Main и SubMain, вам нужно передать parent, а не экземпляр MainApplication (self). Тогда вам не нужно вызывать метод pack для классов, так как оба класса Main и SubMain уже упаковывают свои фреймы:

import tkinter as tk

class Main(tk.Frame):

    def __init__(self, master):
        central = tk.Frame(master)
        central.pack(side="top", fill="both")

class SubMain(tk.Frame):

    def __init__(self,master):
        lowercentral = tk.Frame(master)
        lowercentral.pack(side="top", fill="both")

class MainApplication(tk.Frame):

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.central = Main(parent)
        self.lowercentral = SubMain(parent)

        #self.central.pack(side="top", fill="both")
        #self.lowercentral.pack(side="top", fill="both")


root = tk.Tk()
MainApplication(root)#.pack(side="top", fill="both")
root.mainloop()
0 голосов
/ 08 ноября 2018

Вы можете попробовать это в init function:

 super().__init__(master)

Я использую это, и оно сработало. Надеюсь, оно действительно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...