Саммерфилд - Программирование на Python 3 (1077331), страница 126
Текст из файла (страница 126)
Виджет ассса1АасипсЕаЬе1 также имеет ассоциированную переменную, благодаря этому позднее мы легко можем изменять отображаемый им текст. Кроме того, мы придали этой метке вид утопленного поля, чтобы визуально он гармонировал с движками. рг!пс!ра1саса1.дыз(гак=с. сс1пзп=д, расх=2, разу=2, аыску=!к!и!ег и) рг!пс!ра15са1а.дгы(гак=с, сс1напыц раах=2, разу=2, а!1ску=ск!и!аг.ЕИ) гага!аЬе1.дг!С(гак=1, СС1ппп=с, раах=2, раау=2, ас!Оку=!К!п!аг.и) га!адса1е.дг!0(гоп=1, сс1пап=1, рвах=2, раау=2, ас!сКуснкшсег.
ЕИ) уеагасаае1 дг!0(гак=2, сс1ипп=д, рапх=2, рапу=2, а!!СКустКьлсЕГ.И) уеагааса1а.дг!6(гак=2, сс1иап=1, рапх=2, рапу=2, аС!сКуктк!пгаг.ЕИ) авоппгсаае1.дг!С(гак=а, со1иип=д, расх=2, разу=2, аг!сКу=!К!псег.и) асюа1АпсппссаЬа1,дггп(гси=з, сс!ива=1, раах=2, рапу=2, аг!Ькукгк1псаг,ЕИ) После создания виджетов их нужно разместить. Мы будем использовать схему размещения типа «сетка», как показано на рис. 13.3.
Все виджеты поддерживают метод дг!г)() (и некоторые другие методы схемы размещения, такие как расК()). Вызовом метода дг!О() виджет 560 Глава 13. Введение в программирование графического интерфейса Рис. 13 3. Схема размещения виджетов а окне программы 1агегез1 помещается внутрь родительского виджета в ячейку сетки с указанным номером строки и столбца.
Имеется возможность заставить виджет занять несколько столбцов и несколько строк, используя дополнительные именованные аргументы (гонврап и со1оапврэп), а также имеется возможность добавить отступы вокруг виджета — с помощью именованных аргументов раск (отступы слева и справа) и расу (отступы сверху и снизу), определяя в них величину отступов в пикселях.
Если виджет занимает больше места, чем ему требуется, с помощью аргумента в11сКу можно указать, что он должен делать со свободным пространством; если аргумент не задан, виджет будет занимать середину выделенного пространства. Для всех меток в первом столбце в аргументе вт!сКу передается значение 1Ктптег. И(мевС вЂ” выравнивание по западному, то есть по левому краю), а для всех виджетов в правом столбце — значение СКтп1ег. ЕИ (еавС-тэевС вЂ” с востока на запад, то есть по ширине), что заставляет их растягиваться по всей ширине доступного пространства. Все виджеты сохраняются в локальных переменных, но они не будут утилизированы сборщиком мусора после выхода из метода инициализации благодаря отношениям родитель-потомок, потому что для всех виджетов определен родительский виджет — главное окно.
Иногда виджеты создаются в виде переменных экземпляра — например, когда необходимо обеспечить доступ к ним за пределами метода инициализации, но в данном случае мы использовали переменные экземпляра в роли переменных, ассоциированных со значениями виджетов (ве11, рг!пс1рз), ве!1. гасе и ве1г. уеагв), благодаря чему они будут доступны за пределами метода инициализации.
рг1по1ра15оа1е. Гасов вв1() ве!Г.орзв1еШ() рагепт.о!по("<А11-р>", 1аэьоа ° тцпоге. рг(по1ра1вса1в.гасов вот()) рвгеп1.ь(по("<А11-г>", 1аэьоа *тцпоге: га1еЯса1е.гасов ве1()) рвгепт.ь(по("<А11-у>", 1вэьов ° тцпоге: уввгвьсв1е.гасив вв1()) рагеп1.Ь(пз("<Соптго1-ц>", ве!т.цш1) рагепт.о!пп("<Евсвре>", ве11.ци11) В конце метода инициализации фокус ввода передается виджету рыпс!рз15са1е, чтобы сразу после запуска программы пользователь мог Программы в виде диалога Бб! установить начальную сумму вклада. Затем вызывается метод зе1(. вр- Сзге0!(), вычисляющий конечную общую сумму с учетом процентов. Затем выполняются привязки горячих клавиш. (К сожалению, термин привязка имеет три совершенно разных значения — привязка переменной, когда имя, то есть ссылка на объект, связывается с объектом; привязка горячей клавиши, когда событие нажатия или отпускания клавиши связывается с функцией или методом, вызываемым при появлении этого события; и привязка для библиотеки — это промежуточный программный код, обеспечивающий доступность библиотеки, написанной на другом языке программирования, в программах на языке РуФ)топ, посредством использования модулей РуФЬоп.) Привязка горячих клавиш особенно важна для пользователей с ограниченными возможностями, испытывающих сложности или вообще не способных использовать мышь, а также для тех, кто в совершенстве владеет клавиатурой и старается не пользоваться мышью, так как в их случае использование мыши замедляет темп работы.
Первые три привязки горячих клавиш используются для передачи фокуса ввода виджетам движков. Например, для виджета рг!лсдрз1СаЬе1 устанавливается отображаемый текст Рылсгра1 $:, в котором нулевой символ выводится с подчеркиванием, поэтому текст метки будет выглядеть, как Рплс!ра! э:, и первая привязка горячей клавиши переместит фокус ввода в виджет рг!лс! рз13са1е, когда пользователь нажмет комбинацию клавиш Ай+Р. То же относится и к другим двум привязкам.
Обратите внимание, что в привязках мы не указываем метод госсе эег() непосредственно, потому что при вызове функции или метода по событию в первом аргументе им передается само событие, которое нам не нужно. По этой причине мы используем лямбда-функции, которые принимают, но игнорируют объекты событий и вызывают методы без нежелательного аргумента.
Мы также создали две дополнительные горячие комбинации, то есть комбинации клавиш, которые вызывают определенное действие. Мы настроили комбинации клавиш С!г!+О и Езс, привязав их к методу зе1(. Сшг(), который вызывает завершение программы. Имеется возможность привязывать горячие клавиши непосредственно к самим виджетам, но мы предпочли выполнить все привязки в родительском виджете (в приложении), поэтому они будут действовать независимо от того, где находится фокус ввода. Метод Ьзлб() из библиотеки Т)г может использоваться для привязки нажатий клавиш и щелчков мышью„а также для привязки программных событий. Специальные клавиши, такие как Сбй и Езс, в библиотеке Т)с имеют собственные имена (Солгго1 и Евсаре)„а символьным клавишам соответствуют имена, состоящие из самих символов. Комбинации клавиш создаются посредством помещения имен, составляющих комбинацию клавиш, разделенных символом дефиса, в угловые скобки.
562 Глаэа 1Э. Введение з программирование графического интерфейса Создав и разместив виджеты и настроив горячие комбинации клавиш, мы определили основное поведение приложения. Теперь рассмотрим методы, отвечающие за реакцию на действия пользователя и дополняющие поведение приложения. се! ороатеОТ(ве1(, *!дпоге): ааоопТ = ве1(.рыпстра1.цет() * ( (1 ь (ве1(.гата.цет() / 100.0)) ** ве1т.уеагв.цет()) ве1т.ааоопт.вет("(О:.2()".Тогеат(ааоопт)) Этот метод вызывается всякий раз, когда пользователь изменяет сумму вклада, процент или интервал времени, поскольку этот метод связан с каждым из движков. Бее, что он делает, — извлекает значения движков из ассоциированных переменных, выполняет вычисление процентов и записывает результат (в виде строки) в переменной, ассоциированной с меткой, представляющей окончательную сумму вклада.
Благодаря этому метка всегда отображает актуальное значение. Сет цгДТ(ве1(, еоептт Иове): ве1т.рагепт.оевтгоу() Этот метод вызывается, когда пользователь завершает работу с программой (нажатием комбинации клавиш ЕТТ(+О или Евс, или щелчком мыши на кнопке закрытия окна). Поскольку в программе нет данных, которые требовалось бы сохранить, мы просто сообщаем родительскому виджету (который представляет само приложение), что он должен уничтожить себя. Родительский виджет уничтожит все дочерние виджеты— все окна, которые в свою очередь уничтожат все свои дочерние виджеты, благодаря чему приложение корректно завершит свою работу.
арр1!саттоп = ТК1птег.ТК() рать = ов.рать.)отп(ов.рать.стгпаае( ТТ1е ), "шацев/") тт вув.р1аттога.втагтви!ТЬ("и!п"): !сап = раТЬ е "тптегевт.тсо" е1ве Тсоп = "э" е рать а "1птагевт.кьа" арр1!саТ1оп.!сопштеар(троп) арр!тсаТ!оп.т!Т1е("1птегевт") тпсон = иатпмпоон(арр11сатюп) арр1тсат!оп.
рготосо1("ии Оетете и1ИООи", и!пеон оо!т) арр11саттоп эа!п1оор() За определением класса главного (и в данном случае — единственного) окна следует программный код, который запускает программу. Сначала создается объект, представляющий само приложение. Чтобы снабдить программу ярлыком, в операционной системе т)(т!пт)оуув используется файл .!со, имя которого (и полный путь) передается методу !сосо!Тзар(). Но в системах 1)Х1Х следует передавать файл с растровым изображением (то есть монохромное изображение). Б библиотеке Т)т имеется несколько встроенных растровых изображений, поэтому, что- 564 Глава 13.
Введение в программирование графического интерфейса Программа имеет два окна: главное окно — с полосой меню, панелью инструментов, списком закладок и полосой состояния, и окно диалога — для добавления и редактирования закладок. Создание главного окна Главное окно напоминает окно диалога в том смысле, что оно также содержит виджеты, которые необходимо создать и разместить. Но, кроме того, нам потребуется создать полосу меню, пункты меню, панель инструментов и полосу состояния, а также методы, выполняющие действия по запросам пользователя.
Пользовательский интерфейс целиком создается в методе инициализации главного окна, который мы рассмотрим, разбив его на пять частей, так как он достаточно длинный. с1двз Матпйтпзокн Оет тптт (ве1Г, рагепт): ве1т.рагвпт = рагепт ве1Г,Г11епаее = Мопе ве1т.зтгту = Ра1ве ве1г.пата = 1) еепоьаг = тктптег.мепо(зе1г.рагепт) ве1т.рагепт("аепо") = аепоЬаг В этом примере, вместо того чтобы наследовать стандартный виджет, как это было сделано в предыдущем примере, мы создадим обычный класс.