Структура программы tkinter — лучшие практики

В данный момент я погружаюсь в tkinter, и многие примеры кода в Интернете охватывают только очень простые примеры и не учат передовым методам.

Для лучшей ремонтопригодности и ясности я хотел бы использовать ООП для графического интерфейса, что с моей точки зрения имеет смысл. Тем не менее, я бы прислушался к вашему совету о том, как его структурировать, потому что я в целом новичок. Я уже просмотрел другие вопросы, но они не смогли ответить на мой конкретный общий вопрос, который у меня есть.

Моя идея здесь:

Хотел бы создать строку меню для графического интерфейса и создать новый файл menu.py, который имеет дело только с этим меню. Здесь вы можете найти два примера:

<сильный>1. Пример: Логически строка меню состоит из других меню. Таким образом, меню содержит меню. Но я не уверен, хорошо ли использовать вложенные классы?

import tkinter as tk

class Menu(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.parent = parent
        self.menubar = Menubar(self)

    class Menubar(tk.Menu):
        def __init__(self, parent, *args, **kwargs):
            super().__init__(parent, *args, **kwargs)
            self.parent = parent

            self.add_cascade(label="File", menu=self.file_menu)
            self.add_cascade(label="Edit", menu=self.edit_menu)

            self.file_menu = FileMenu(self)
            self.edit_menu = EditMenu(self)

        class FileMenu(tk.Menu):
            def __init__(self, parent, *args, **kwargs):
                super().__init__(parent, *args, **kwargs)
                self.parent = parent

        class EditMenu(tk.Menu):
            def __init__(self, parent, *args, **kwargs):
                super().__init__(parent, *args, **kwargs)
                self.parent = parent

<сильный>2. Пример: Здесь вы можете найти более процедурный пример. Но слабость здесь, с моей точки зрения, заключается в том, что иерархически Menubar, а также file_menu и edit_menu находятся на одном уровне. Но логически Menubar состоит из file_menu и edit_menu. Таким образом, это не совсем модульный. С другой стороны, возможно (?) его легче читать, чем первый пример.

import tkinter as tk

class Menu(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.parent = parent
        self.menubar = tk.Menu(self)

        self.create_file_menu(self.menubar)
        self.create_edit_menu(self.menubar)

    def create_file_menu(self, parent):
        self.file_menu = tk.Menu(parent)
        self.menubar.add_cascade(label="File", menu=self.file_menu)

    def create_edit_menu(self, parent):
        self.edit_menu = tk.Menu(parent)
        self.menubar.add_cascade(label="Edit", menu=self.edit_menu)

person Aliquis    schedule 20.02.2017    source источник
comment
знаете ли вы, что объявляете класс внутри другого класса?   -  person WhatsThePoint    schedule 20.02.2017
comment
Да, я написал это в своем тексте.   -  person Aliquis    schedule 20.02.2017
comment
извините, не видел эту часть, но было бы лучше разделить их и вызвать их, когда они вам понадобятся   -  person WhatsThePoint    schedule 20.02.2017
comment
Я думаю, что это лучше подходит для code Review SE.   -  person TidB    schedule 20.02.2017
comment
@TidB Code Review не имеет дело с примерами, поэтому у меня есть сомнения по этому поводу.   -  person Mast    schedule 20.02.2017
comment
Вероятно, это слишком широкий вопрос для SO. Однако я согласен с @WhatsThePoint. В этом случае я не вижу смысла в вложении классов — вы, вероятно, просто столкнетесь с раздражающими проблемами позже, если захотите что-то повторно использовать.   -  person pingul    schedule 20.02.2017
comment
Возможный дубликат Лучший способ структурировать приложение tkinter   -  person WhatsThePoint    schedule 20.02.2017


Ответы (1)


Вложенность класса не снижает и не повышает эффективность выполнения. Это может изменить эффективность обслуживания и понимания. Вложенные классы Python не похожи на вложенные классы Java, где внутренний класс может ссылаться на экземпляры внешнего класса. Фактически это два отдельных класса.

Таким образом, ваш пример 1 лучше, чем пример 2.

См. также:

person Kardi Teknomo    schedule 09.12.2017