Прикрепление к фреймам

prikreplenie k frejmam Экскурсия по tkinter, часть 1

Чтобы проиллюстрировать иерархическое построение графического интерфейса в более крупном масштабе, чем это делалось до сих пор, пример 8.32 объединяет все четыре сценария панелей запуска диалогов из этой главы в одном контейнере. В нем повторно используется программный код примеров 8.9, 8.22, 8.25 и 8.30.

Пример 8.32. PP4E\Gui\Tour\demoAllfrm.py

4 класса демонстрационных компонентов (вложенных фреймов) в одном окне;

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

from tkinter import *

from quitter import Quitter

demoModules = [‘demoDlg’, ‘demoCheck’, ‘demoRadio’, ‘demoScale’] parts = []

def addComponents(root):

for demo in demoModules:

module = __import__(demo) # импортировать по имени в виде строки

part = module.Demo(root) # прикрепить экземпляр

part.config(bd=2, relief=GROOVE) # или передать параметры

#   конструктору Demo() part.pack(side=LEFT, expand=YES, fill=BOTH) # растягивать

#                                                 вместе с окном

parts.append(part) # добавить в список

def dumpState():

for part in parts:

print(part.__module__ + ‘:’, end=’ ‘)

if hasattr(part, ‘report’): # вызвать метод report,

part.report() # если имеется

else:

print(‘none’)

root = Tk() # явно создать корневое окно

root.title(‘Frames’)

Label(root, text=’Multiple Frame demo’, bg=’white’).pack()

Button(root, text=’States’, command=dumpState).pack(fill=X)

Quitter(root).pack(fill=X) addComponents(root) root.mainloop()

Поскольку все четыре демонстрационные панели запуска реализованы в виде фреймов, которые могут прикрепляться к родительским виджетам, объединить их в одном графическом интерфейсе намного проще, чем вы думаете. Для этого нужно лишь передать один и тот же родительский виджет (в данном случае окно root) во все четыре вызова конструкторов демонстрационных примеров, после чего скомпоновать и настроить созданные демонстрационные объекты желаемым образом. На рис. 8.32 показано, как выглядит результат — одно окно, в которое встроены экземпляры всех четырех знакомых нам демонстрационных панелей запуска диалогов. В данном примере все четыре встроенных панели изменяют свои размеры при изменении размеров окна (попробуйте убрать параметр expand=YES, чтобы панели сохраняли свои размеры постоянными).

Рис. 8.32. demoAll_frm: вложенные фреймы

 

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

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

C:\\PP4E\Gui\Tour> python demoAll_frm.py

in onMove 0

in onMove 0

demoDlg: none

demoCheck: 0 0 0 0 0

demoRadio: Error

demoScale: 0

you pressed Input result: 1.234

in onMove 1

demoDlg: none

demoCheck: 1 0 1 1 0

demoRadio: Input

demoScale: 1

you pressed Query

result: yes

in onMove 2

You picked 2

None

in onMove 3

You picked 3

C:/Users/mark/Stuff/Books/4E/PP4E/dev/Examples/PP4E/Launcher.py

3

Query

1 1 1 1 0

demoDlg: none

demoCheck: 1 1 1 1 0

demoRadio: Query

demoScale: 3

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

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