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

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

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

Пример 7.21. PP4E\Gui\Intro\gui6b.py

from sys import exit

from tkinter import * # импортировать классы виджетов Tk

from gui6 import Hello # импортировать подкласс фрейма

parent = Frame(None) # создать контейнерный виджет

parent.pack()

Hello(parent).pack(side=RIGHT) # прикрепить виджет Hello, не запуская его

Button(parent, text=’Attach’, command=exit).pack(side=LEFT) parent.mainloop()

Рис. 7.21. Прикрепленный компонент класса справа

 

В этом сценарии кнопка Hello добавляется к правому краю родителя parentконтейнера Frame. На самом деле, кнопка в правой части этого окна является встроенным компонентом: его кнопка действительно представляет прикрепленный объект класса Python. Нажатие кнопки встроенного класса справа, как и ранее, выводит сообщение; нажатие новой кнопки закрывает окно вызовом sys.exit:

C:\\PP4E\Gui\Intro> python gui6b.py

Hello frame world 43!

Hello frame world 44!

Hello frame world 45!

Hello frame world 46!

В более сложных интерфейсах можно прикреплять большие подклассы Frame к другим компонентам-контейнерам и разрабатывать каждый из них независимо. В примере 7.22 демонстрируется еще один специализированный подкласс класса Frame, который прикрепляет экземпляр класса Hello более объектно-ориентированным способом. При запуске в виде самостоятельного сценария он создает окно, идентичное изображенному на рис. 7.21.

Пример 7.22. PP4E\Gui\Intro\gui6c.py

from tkinter import * # импортировать классы виджетов Tk

from gui6 import Hello # импортировать подкласс фрейма

class HelloContainer(Frame):

def __init__(self, parent=None):

Frame.__init__(self, parent) self.pack() self.makeWidgets()

def makeWidgets(self):

Hello(self).pack(side=RIGHT) # прикрепить объект класса Hello к себе Button(self, text=’Attach’, command=self.quit).pack(side=LEFT)

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

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

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

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

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