Расширение классов компонентов

rasshirenie klassov komponentov Графические интерфейсы пользователя

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

Пример 7.23. PP4E\Gui\Intro\gui6d.py

from tkinter import * from gui6 import Hello

class HelloExtender(Hello):

def make_widgets(self): # расширение метода

Hello.make_widgets(self)

Button(self, text=’Extend’, command=self.quit).pack(side=RIGHT)

def message(self): print(‘hello’, self.data) # переопределение метода

if __name__ == ‘__main__’: HelloExtender().mainloop()

Метод make_widgets этого подкласса сначала создает виджеты обращением к методу суперкласса, а затем добавляет справа вторую кнопку Extend, как показано на рис. 7.22.

74 tk | a || В ||^Ь

Hello frame world! Extend

Рис. 7.22. Модифицированные виджеты класса слева

Поскольку этот подкласс переопределяет метод message, нажатие кнопки исходного суперкласса, расположенной слева, теперь выводит в stdout другую строку (когда осуществляется поиск вверх по дереву наследования, начиная от объекта self, первым обнаруживается атрибут message в этом подклассе, а не в суперклассе):

C:\…\PP4E\Gui\Intro> python gui6d.py

hello 42

hello 42

hello 42

hello 42

Но нажатие новой кнопки Extend справа, добавленной этим подклассом, приводит к немедленному выходу из приложения, потому что обработчиком событий от добавленной кнопки является метод quit (унаследованный от Hello, который в свою очередь наследует его от Frame). Таким образом, этот класс модифицирует исходный класс, добавляя новую кнопку и изменяя поведение метода message.

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

Мораль заключается в том, что графические интерфейсы, использующие библиотеку tkinter, можно программировать вообще без создания новых классов, но использование классов для структурирования программного кода в конечном итоге значительно расширяет возможности его повторного использования. При правильном подходе можно не только прикреплять уже отлаженные компоненты к новым интерфейсам, но и изменять их поведение в новых внешних подклассах в соответствии с особыми требованиями. В любом случае первоначальные затраты, связанные с использованием классов, должны в итоге окупиться за счет сокращения времени разработки.

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

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