LINUX.ORG.RU

Как в Python & tkinter при использовании MVC создать главное окно программы?

 , ,


2

1

Пытаюсь реализовать шаблон MVC для приложения по примеру https://github.com/li360/tkinter-mvc

В классе, отвечающим за создание главного окна приложения не знаю какие параметры использовать, - не отображаются элементы окна.

В примере два окна обмениваются данными, поэтому у них родительский класс выбран Toplevel. Но Toplevel не позволяет использовать вложенные элементы, такие как меню, ttk.Notebook и пр. и его рекомендуется использовать для диалоговых окон.

Как я понимаю, что происходит:

В main.py создается объект контроллера, ему передается ссылка на главное окно приложения, созданное с помощью root = Tk() => app = Controller(root).

В сонтроллере MainController.py создается объект окна self.view_main_window = ViewMainWindow(root) которому, в свою очередь, передается ссылка на главное окно приложения уже из класса контроллера.

MainView.py получает ссылку в конструкторе def init(self, parent), переименовывает self.master = parent. Дальше виджеты используют ее для определения своей принадлежности.

Это в теории, на практике, - после запуска окна нет, но и сообщений об ошибках тоже нет.

main.py
from tkinter import *
from controllers.MainController import Controller

if __name__ == '__main__':
    root = Tk()
    root.title("PyDOE-tk")
    root.withdraw()
    app = Controller(root)
    root.mainloop()


controllers/MainController.py
from models.MainModel import Model
from views.MainView import ViewMainWindow

class Controller:
    def __init__(self, root):
        self.model = Model()
        self.view_main_window = ViewMainWindow(root) 


views/MainView.py
from tkinter import *

class ViewMainWindow(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.master = parent                    
        self.frame = Frame()
        self.frame.pack()
        self.button = Button(self.frame, text="myButton")
        self.button.pack(side=BOTTOM)
        self.name = Label(self.frame, text='Label')
        self.name.pack()

Если выбрать родительским классом Toplevel (как в примере на github), то окно показывается, но пустое:

class ViewMainWindow(Toplevel):
    def __init__(self, parent):
        Toplevel.__init__(self, parent)
        self.master = parent
        self.protocol('WM_DELETE_WINDOW', self.master.destroy)                    
        self.frame = Frame()
        self.frame.pack()
        self.button = Button(self.frame, text="myButton")
        self.button.pack(side=BOTTOM)
        self.name = Label(self.frame, text='Label')
        self.name.pack()

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.