В моем, по общему признанию, ограниченном опыте программирования графического интерфейса OO (в основном с 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()
С другой стороны, глава 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 ответа
Мое практическое правило простое: если вам понадобится ссылаться на него позже, сделайте его атрибутом. Если нет, не надо.
Я не уверен, что могу перечислить какие-либо плюсы и минусы этого подхода - ни сохранение всех ссылок, ни сохранение только тех, которые вам нужны, - это особенно хорошо или плохо, это в основном вопрос стиля.
При этом, однако, создание атрибута для виджета может означать, что он используется где-то еще. Если он не используется где-либо еще, люди могут сделать выводы о вашем коде, которые не соответствуют действительности.
Во многих случаях вам не нужно будет ссылаться на виджет после того, как вы добавите его в окно и соедините его с событиями; в этих случаях виджет не будет считаться атрибутом. Кроме того, если контейнер является динамическим, вы не должны делать виджет атрибутом (поскольку вы заранее не знаете, какие виджеты будут у объекта).
Если контейнер является статическим и вы знаете, что вам понадобится ссылаться на виджет позже, вы можете сделать его атрибутом объекта; это сделает ссылки на виджет в других частях класса ясными и компактными.
Похожие вопросы
Новые вопросы
user-interface
Пользовательский интерфейс (UI) - это система, с помощью которой люди взаимодействуют с компьютером. Этот тег можно использовать для вопросов программирования, связанных с пользовательским интерфейсом. Обратите внимание, что существует отдельный сайт Stack Exchange для пользовательских интерфейсов, взаимодействий с компьютером и дизайна пользовательского интерфейса: https://ux.stackexchange.com.