Саммерфилд - Программирование на Python 3 (1077331), страница 127
Текст из файла (страница 127)
В случае наследования мы можем переопределять методы наследуемого класса, но когда в этом нет необходимости, мы можем просто использовать прием композиции, как сделано в данном примере. Визуальное представление приложения создается за счет создания переменных экземпляра, содержащих виджеты, которые помещаются внутрь виджета 1к1пте г. Е газе, как будет показано чуть ниже. Нам необходимо сохранить следующие данные: ссылку на родительский объект (приложение), имя текущего файла с закладками, флаг наличия изменений (если имеет значение Т гсе, это свидетельствует о том, что в данных имеются изменения, которые не были сохранены на диск) и сами закладки — словарь, ключами которого служат имена закладок, а значениями — адреса ПВВ.
Чтобы создать полосу меню, необходимо создать объект тКтптег. Мело, родителем которого является объект-родитель окна, и сообщить родителю, что у него имеется меню. (Может показаться странным, что полоса меню является пунктом меню, но библиотека Т)с прошла очень длинный путь развития, и в ней еще остались некоторые пережитки прошлого.) Полосы меню, создаваемые таким способом, не требуют специального размещения — библиотека Т)с сделает это самостоятельно.
Гт)енепс = тх!птег.Мело(аепоЬаг) Гог 1аЬе1, соааапз, зпогтсот техт, звогтсот ш ( Программы с глазным окном 565 ("йеи...", ве1(. ТТ1ейеи, "С!г1+й", "<Сопгго1-и>"), ("Ореп...", ве!Т.Т!1едреп, "С!г1+О", "<Сопгго1-о>"), ("даче", ве1(.г!1едаче, "с!<1ч8", "<сопгго1-в>"), (йопе, йопе, йопе, попе), ("Оо!!", ве1г.т!1еОо>1, "сгг1ч0", "<соп!го1-с>")); !Т 1аое1 Тв йопе; Г!1ейепо.асс верагагог() е1ве. Т!1ейепо.асс соааапс( 1аое1=1аЬе1, опсег1>ее=О, соввапо=соааапо, ассе1егагог=вьог!со! !ех!) ве1(.рагеп!.ыпо(вьог!счг, соааапо) аепчоаг.асс савсасе(1аое1="РТ1е", аепо=(!!ейепч, чпсег1>пе=д) Таким способом создаются все полосы меню. Сначала создается объект тйап!ег, йепо, который является дочерним по отношению к полосе меню, а затем в меню добавляются команды и разделители. (Обратите внимание, что акселератором в терминологии библиотеки Т)< называется горячая комбинация клавиш и что в параметре ассе1е<а(о г задается текст, обозначающий комбинацию клавиш, а вовсе не привязку клавиш.) Параметр опзег1!пе определяет, какой символ должен выводиться с подчеркиванием; в данном случае с подчеркиванием будут выводиться первые символы всех пунктов меню, и они же будут играть роль акселераторов.
При добавлении пункта меню (названного командой) мы также определяем горячую комбинацию клавиш, привязывая ее к той же команде, которая будет выполняться при выборе соответствующего пункта меню. В самом конце меню добавляется в полосу меню вызовом метода аОС савсаде().
Мы опустили определение меню Еб(1, так как программный код, создающий его, по своей структуре идентичен программному коду, создающему меню Гйе. !газе = !к>пгег.ргаае(ве1(.рагеп!) ве1(.гоо1ьаг !задев = () !ос!Ьаг = гй!и!ег.ргаае((газе) Гог гааце, созаапс !и ( ("!задев/Т!1епеи.д>Т", ве1а.т!1ейеи), ("!задев/Т!1еореп,д!Т", ве1(.Г>1едреп), ("!задев/Г!1еваче.д>Г', ве1(.Г!1едаче), ("!задев/ес!!асс.ц!Т, ве!Г.ес!ЬАОО), ( !задев/ео!!еоТ!.ОТГ, ве!т.ео!!ео!!), ("!задев/ео!!Ье1е!е,д!г", ве1(.ес>!Ое1е!е), ("Таацев/ео>!впоииеьраце.ц!г", ве1(.ео!18поийеьраде)); !ваде = ов.ра!Ь.)сап(оз.ра!Ь.О1гпаае( т!1е ), лаце) !гу: Таа9е = !кап!а<.Рпого1ааце(т!1е=Тааце) ве1(.!ЬЬ1оаг лацез.аррепе(!заде) ьо!!оп = !к!пгег.Вомоп(!оо1ьаг, лаце=>ааце, соааапо=соааапо) ьо!!Ьп.цг!Ь(гои=с, со1оап=1еп(зе1(.!Ьо1ьаг !задев) -1) ехсер! !к!пгег.ТЬ1Еггог ав егг: $66 Глава 1Э.
Введение в программирование графического интерфейса рггпг(егг) ССС1ЬаГ,Отв(Грамс, Со!Пав=О, СС1ОВПВраП=2, ВГ1СКутК(ПГЕГ.ВН) Затем создается рабочее пространство„в котором будут размещаться все виджеты окна. Затем создается еще одна область, гоо1Ьа г, содержащая горизонтальную полосу с кнопками с изображениями вместо текстовых надписей, которые будут играть роль инструментальных кнопок. Все кнопки располагаются друг за другом в ячейках сетки, содержащей одну строку и столько столбцов, сколько требуется кнопок. В конце пространство с панелью инструментов помещается в первую строку сетки рабочего пространства окна, с выравниванием по северо-западу, благодаря чему панель всегда будет находиться в верхнем левом углу окна.
(Библиотека Т)с автоматически помещает полосу меню выше всех виджетов окна.) Схема расположения виджетов в главном окне показана на рис. 13.6, где полоса меню, размещаемая самой библиотекой 'Пс, выделена белым цветом, а виджеты, размещаемые нами, — серым. Когда изображение добавляется в кнопку, оно добавляется как слабая ссылка, поэтому сразу после выхода из области видимости эти изображения будут запланированы к утилизации. Нам следует избежать этого эффекта, потому что нам необходимо, чтобы изображения оставались на кнопках после выхода из метода инициализации, поэтому мы создаем переменную экземпляра ве11,(оо1Ьаг (азцез, которая будет хранить ссылки на изображения, предохраняя их от исчезновения на протяжении всего времени жизни программы.
По умолчанию библиотека Т)с имеет возможность читать файлы изображений только определенных форматов, поэтому мы вынуждены использовать изображения в формате .у(Г.' Если какой-то файл с изображением не будет найден, будет возбуждено исключение (кгпгег.ТО1- Еггсг, которое необходимо перехватить и обработать, чтобы избежать завершения программы из-за нехватки какого-нибудь изображения. Рис. 13,б. Схема расположения виджетсв в главном окне програмлгм Ввоптагвг Если для библиотеки ТЬ установлено расширение Руьйоп 1пий(вб 1лбгагу, появляется возможность использовать все современные форматы графических изображений. Подробности можно найти на сайте ипвгвругпспигаге.сот/ргодисгг/рд/. Программы с главным окном 567 Обратите внимание, что не все действия, предусматриваемые системой меню, мы сделали доступными в виде кнопок панели инструментов— это распространенная практика. вого11Ьаг = !К!п!ег, ЗсгоПЬаг(!гаво, ог!оп!=!Кгп!ег.уЕВТ1САК) ва1Г.
11в!Вох = !К!пгаг. Е!в!Ьах( !газе, увсго11соввапо=всго11ьаг.ве!) ва1г. 1!вгВох,цг!о(гав=), со1авп=О, в!!скукткгпгаг.взел) ве1г. 1!в!Вах.гасов вв!() вого11ьаг( "совпала" ] = ве1!. 1!в!Вох, ух!ав вого11ьаг.цыа(гав=1, оо1авп=1, вг!скуктк!и!ег.из) ве1п в!а!авьаг = гк!и!аг.саьа1((газе, !ах!к'Веаау...
апопог=!к!и!ег.й) вв1П в!агавЬаг.а(гег(5000, ве1П о1еагЗ!а!ЬвВаг) ве1П в!агавоаг,дг!О(гав=2, со1авп=О, со1авпврап=2, в!!оКу=!К!псег.ЕИ) (газа.цг!О(гав=О, со1авп=ц, в!!скукткап!ег.кзей) Центральную область окна (область между панелью инструментов и строкой состояния) занимает виджет списка и ассоциированная с ним полоса прокрутки. Виджет списка размещается с выравниванием по всем направлениям, а полоса прокрутки — только с выравниванием по северу и югу (погФ)у-вои!)а, то есть вертикально). Оба виджета добавляются в сетку центральной области окна бок о бок.
Нам необходимо гарантировать, что при перемещении по списку с помощью клавиш управления курсором или при изменении позиции движка в полосе прокрутки, оба виджета будут синхронизироваться между собой. Для этого при создании виджета списка в аргументе увсго11соввапц ему передается метод ве!() полосы прокрутки (чтобы при перемещении по списку полоса прокрутки перемещала бы движок соответственно текущей позиции в списке), а в атрибут саввапц полосы прокрутки записывается метод уу!ен( ) виджета списка (чтобы при перемещении движка полосы прокрутки соответственным образом происходилаи прокрутка списка). Полоса состояния — это просто метка.
Метод а(!ег() запускает таймер однократного срабатывания (таймер, который срабатывает всего один раз через указанный интервал времени). В первом аргументе методу передается интервал времени в миллисекундах, а во втором аргументе— функция или метод, который должен быть вызван по истечении указанного времени. Это означает, что сразу после запуска программы, в течение пяти секунд, в строке состояния будет отображаться текст «Везиру... «, после чего строка состояния будет очищена.
Строка состояния размещается в самой последней строке, с выравниванием с запада на восток (хвев(-еав1, горизонтально). В самом конце в окно добавляется сама рабочая область. На этом мы завершили создание главного окна и размещение виджетов в нем, но при такой реализации все виджеты по умолчанию будут иметь фикси- 568 Глава 13. Введение а программирование графического интерфейса рованный размер и изменение размеров окна не будет приводить к изменениям размеров виджетов. Следующий фрагмент программного кода решает эту проблему и завершает метод инициализации.
(газе.со1ошпсопт!цоге(0, ые!цж=999) (газе,со1ошпсоптвциге(1, нетцы=!) !газе.гоысопттцогв(0, ые!цШ=Т) (газе.гонсопттцогв(1, ыетцж=999) !газе.гоысопттдоге(2, не!ды=1) ытпооы = ве1(.рагеп!.ытпто тор1вхв1() ывпсоы.со1пшпсопттцоге(0, ыетдог=)) и!попы,гоысопттцоге(0, на!дат=т) вв1( рагепт.цеошетгу("(0)х(1)+(2)ш(3)".Тогшат(400, 500, О, 50)) ве1(.рагепт.т!11е("Воокшагкв - дппашео") Методы со1ошпсопт!доге() и гонора(!доге() позволяют определять вес столбцов и строк сетки. Сначала определяется вес для сетки рабочей области окна, первому столбцу и второй строке (где находится виджет списка) придается максимальный вес, поэтому при изменении размеров рабочей области весь избыток пространства будет отдан виджету списка.