Вместо того чтобы выполнять все операции вручную, правильнее было бы создать оболочку или как-то иначе максимально автоматизировать процесс построения графического интерфейса. Одним из решений является создание функций, обеспечивающих создание виджетов с типичными настройками и автоматизирующих процесс конструирования. Например, можно было бы определить функцию создания кнопки, реализующую все тонкости настройки и поддерживающую большинство необходимых нам кнопок. В примере 10.1 демонстрируется группа таких функций, создающих виджеты.
Пример 10.1. PP4E\Gui\Tools\widgets.py
############################################################################## функции-обертки, упрощающие создание виджетов и опирающиеся на некоторые допущения (например, режим растягивания); используйте словарь **extras именованных аргументов для передачи таких параметров настройки, как ширина, шрифт/цвет и других, и повторно компонуйте возвращаемые виджеты, если компоновка по умолчанию вас не устраивает;
##############################################################################
from tkinter import *
def frame(root, side=TOP, **extras):
widget = Frame(root)
widget.pack(side=side, expand=YES, fill=BOTH) if extras: widget.config(**extras) return widget
def label(root, side, text, **extras):
widget = Label(root, text=text, relief=RIDGE) # настройки по умолчанию widget.pack(side=side, expand=YES, fill=BOTH) # компонуется автоматически if extras: widget.config(**extras) # применить все
return widget # дополнительные параметры
def button(root, side, text, command, **extras):
widget = Button(root, text=text, command=command)
widget.pack(side=side, expand=YES, fill=BOTH) if extras: widget.config(**extras) return widget
def entry(root, side, linkvar, **extras):
widget = Entry(root, relief=SUNKEN, textvariable=linkvar)
widget.pack(side=side, expand=YES, fill=BOTH)
if extras: widget.config(**extras)
if __name__ == ‘__main__’: app = Tk() frm = frame(app, TOP) # программного кода теперь требуется намного меньше! label(frm, LEFT, ‘SPAM’) button(frm, BOTTOM, ‘Press’, lambda: print(‘Pushed’)) mainloop()
Этот модуль опирается на некоторые допущения, касающиеся его использования клиентами, и обеспечивает автоматизацию типичных последовательностей операций конструирования виджетов, такие как размещение методом pack. В результате применение этого модуля позволяет уменьшить объем программного кода в импортирующих его программах. Если запустить модуль из примера 10.1 как самостоятельный сценарий, он создаст простое окно с меткой в выступающей рамке слева и с кнопкой справа, в случае щелчка на которой в поток stdout выводится сообщение. Оба виджета растягиваются вместе с окном. Запустите этот пример у себя — его окно действительно не содержит ничего нового для нас, а его программный код организован скорее как библиотека, чем сценарий, который позднее будет повторно использоваться в программе PyCalc, в главе 19.
Такое решение, основанное на функциях, может сократить объем необходимого программного кода. Однако функции не обеспечивают возможность специализации, как это позволяют классы при объектноориентированном подходе. Кроме того, они не являются методами и не обладают доступом к информации о состоянии объекта, представляющего элемент графического интерфейса.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011