Стиль программирования GUI OO: назначать виджеты атрибутам экземпляра? - PullRequest
0 голосов
/ 29 августа 2011

В моем, по общему признанию ограниченном, опыте программирования OO GUI (в основном с JAVA и Tkinter) я заметил, что в некотором коде все виджеты присваиваются атрибутам экземпляра, в то время как в другом коде мало, если таковые имеются.

Например, в Простой программе Hello World из главы Tkinter документации по python обе кнопки назначаются атрибутам экземпляра класса Application:

class Application(Frame):
    ...

    def createWidgets(self):
        self.QUIT = Button(self)
        ...
        self.hi_there = Button(self)
        ...

    def __init__(self, master=None):
        Frame.__init__(self, master)
        ...
        self.createWidgets()

Onс другой стороны, глава Dialog Windows книги Tkinter определяет класс поддержки диалогов, при этом ни один из его виджетов не назначен атрибутам экземпляра:

class Dialog(Toplevel):
    def __init__(self, parent, title = None):
        Toplevel.__init__(self, parent)
        ...
        body = Frame(self)
        ...
        self.buttonbox()
        ...
    ...
    def buttonbox(self):
        ...
        box = Frame(self)

        w = Button(box, ...)
        ...
        w = Button(box, ...)
        ...
    ...

Оператор вопроса

Каковы плюсы / минусы каждого подхода и существуют ли ситуации, в которых было бы более целесообразно использовать один подход вместо другого?

Ответы [ 2 ]

1 голос
/ 30 августа 2011

Мое простое правило простое: если вам понадобится ссылаться на него позже, сделайте его атрибутом.Если нет, не надо.

Я не уверен, что смогу перечислить плюсы или минусы этого подхода - ни сохранение всех ссылок, ни сохранение только тех, которые вам нужны, особенно хорошо или плохо, это в основном вопрос стиля.

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

0 голосов
/ 29 августа 2011

Часто вам не нужно ссылаться на виджет после того, как вы добавили его в окно и связали его с событиями; в этих случаях виджет не станет атрибутом. Кроме того, если контейнер является динамическим, вы не сделаете виджет атрибутом (так как вы не будете заранее знать виджеты, которые будет иметь объект).

Если контейнер статический, и вы знаете, что вам нужно сослаться на виджет позже, вы можете сделать его атрибутом объекта; это сделает ссылки на виджет в других частях класса понятными и компактными.

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