В данном примере класс 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)
text = self.st.text.get(SEL_FIRST, SEL_LAST)
self.st.text.delete(SEL_FIRST, SEL_LAST) …часть программного кода опущена…
При таком подходе нет необходимости наследовать класс Frame (виджеты можно было прикреплять непосредственно к родителю), а принадлежность к фреймам позволяет весь этот пакет встраивать и настраивать целиком. Если запустить этот сценарий, он создаст схожее окно. Что лучше — композиция или наследование — судить вам. При правильном использовании классов графического интерфейса они будут работать в любом режиме.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011