Композиция и наследование

kompoziciya i nasledovanie Экскурсия по tkinter, часть 2

В данном примере класс SimpleEditor использует наследование для расширения ScrolledText дополнительными кнопками и методами обработчиков. Как мы уже видели, допускается также прикреплять (встраивать) объекты графического интерфейса, реализованные как компоненты, подобно ScrolledText. Модель, когда компоненты прикрепляются, обычно называется композицией; существует мнение, что она проще для понимания и реже приводит к конфликту имен, чем расширение наследованием.

Чтобы дать представление о различиях между этими двумя подходами, ниже приводится набросок программного кода, в котором объект ScrolledText прикрепляется к объекту SimpleEditor. Измененные строки выделены в нем полужирным шрифтом (полную реализацию приема композиции можно найти в файле simpleedit2.py, в пакете с примерами). В основном задача состоит в передаче правильных родительских элементов и добавлении атрибута st каждый раз, когда требуется получить доступ к методам виджета Text:

class SimpleEditor(Frame):

def __init__(self, parent=None, file=None):

Frame.__init__(self, parent)

self.pack()

frm = Frame(self)

frm.pack(fill=X)

Button(frm, text=’Save’, command=self.onSave).pack(side=LEFT)

часть программного кода опущена

Quitter(frm).pack(side=LEFT)

self.st = ScrolledText(self, file=file) # прикрепить, не подкласс self.st.text.config(font=(‘courier’, 9, ‘normal’))

def onSave(self):

filename = asksaveasfilename() if filename:

alltext = self.st.gettext() # доступ через атрибут

open(filename, ‘w’).write(alltext)

def onCut(self):

text = self.st.text.get(SEL_FIRST, SEL_LAST)

self.st.text.delete(SEL_FIRST, SEL_LAST) часть программного кода опущена

При таком подходе нет необходимости наследовать класс Frame (виджеты можно было прикреплять непосредственно к родителю), а принадлежность к фреймам позволяет весь этот пакет встраивать и настраивать целиком. Если запустить этот сценарий, он создаст схожее окно. Что лучше — композиция или наследование — судить вам. При правильном использовании классов графического интерфейса они будут работать в любом режиме.

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий