Например, хотя мы и не будем углубляться в изучение параметров настройки виджетов до следующей главы, тем не менее подобный класс кнопки мог бы обеспечить стандартизацию внешнего вида, отличного от внешнего вида, придаваемого библиотекой tkinter по умолчанию, для каждого своего экземпляра, и приблизиться к реализации таких понятий, как «стили» или «темы», используемых в некоторых других инструментах создания графических интерфейсов:
class ThemedButton(Button): # настраивает стиль
def __init__(self, parent=None, **configs): # для всех экземпляров Button.__init__(self, parent, **configs) # описание параметров self.pack() # смотрите в главе 8
self.config(fg=’red’, bg=’black’,
font=(‘courier’, 12), relief=RAISED, bd=5)
B1 = ThemedButton(text=’spam’, command=onSpam) # обычные виджеты кнопок
B2 = ThemedButton(text=’eggs’) # но наследуют общий стиль
B2.pack(expand=YES, fill=BOTH)
Этот фрагмент приводится лишь для предварительного ознакомления — полную версию вы найдете в файле gui5b—themed.py в дереве примеров, а дополнительные сведения о параметрах настройки виджетов — в главе 8. Но он иллюстрирует возможность придания общего внешнего вида за счет создания подклассов виджетов — все кнопки, созданные из этого класса, будут выглядеть одинаково, и автоматически будут изменять внешний вид при любых изменениях в классе.
Прием создания подклассов — это, безусловно, инструмент программиста, но мы можем сделать возможность настройки доступной и для пользователей графических интерфейсов. В крупных программах, демонстрируемых далее в этой книге (например, PyEdit, PyClock и PyMail— GUI), мы иногда будем добиваться похожего эффекта за счет импортирования настроек из модулей и применения их к виджетам, как если бы они были встроенными настройками. Если такие внешние настройки использовать в подклассах виджетов, таких как наш класс ThemedBut— ton выше, они будут применяться ко всем экземплярам и подклассам (для справки: полная версия следующего фрагмента находится в файле gui5b—themed—user.py):
from user_preferences import bcolor, bfont, bsize # получить настройки
class ThemedButton(Button):
def __init__(self, parent=None, **configs): Button.__init__(self, parent, **configs) self.pack() self.config(bg=bcolor, font=(bfont, bsize))
ThemedButton(text=’spam’, command=onSpam) # обычные виджеты кнопок, но ThemedButton(text=’eggs’, command=onEggs) # наследуют настройки пользователя
class MyButton(ThemedButton): # подклассы также наследуют
def __init__(self, parent=None, **configs): # настройки пользователя ThemedButton.__init__(self, parent, **configs) self.config(text=’subclass’)
MyButton(command=onSpam)
Напомню, что подробнее о параметрах настройки виджетов будет рассказываться в следующей главе, а здесь я хотел лишь донести общую мысль, что настройка виджетов путем создания подклассов позволяет определять не только поведение, но и внешний вид всего набора виджетов. Следующий пример демонстрирует еще один способ настройки — создание настраиваемых и присоединяемых пакетов виджетов, обычно известных, как компоненты.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011