Саммерфилд - Программирование на Python 3 (1077331), страница 128
Текст из файла (страница 128)
Только этого еще недостаточно — нам необходимо разрешить изменение размеров окна верхнего уровня, содержащего рабочую область, что мы и сделаем, получив ссылку на объект окна вызовом метода нтп!п(о тор1еуе1() и установив вес строки и столбца равным 1. В конце метода устанавливаются начальные размеры окна и его положение с помощью строки в формате шнринакаысотатхту. (Если бы нам потребовалось определить только размеры окна, мы могли бы сделать это с помощью строки в формате ширинаквысота.) Наконец, установкой заголовка окна мы завершаем создание пользовательского интерфейса.
Если пользователь щелкнет на кнопке в панели инструментов или выберет пункт меню, будет вызван метод, ответственный за выполнение данной операции. Некоторые методы опираются на использование других, вспомогательных методов. Мы поочередно рассмотрим все методы, начав с того, который вызывается через пять секунд после запуска программы. оет с1еагдтатовВаг(ве1Г): ве1(.втатовоаг["техт") = Строка состояния — это простой виджет тнтптег. [аЬе1. Для ее очистки мы могли бы в методе а(те г() использовать лямбда-выражение, но, так как нам потребуется очищать строку состояния из разных точек программы, мы создали для этого специальный метод. Оет Г!1еаеы(ве!Г.
*тцпоге): гг по! ве1г.окаутосопт!пов(): гатигп ве1( 1ТвгВох.ое1ете(0, ткгптег.Вид) Программы с главным окном 569 ае! П бс ггу = Еа1ае ае1Г. Г!1епаве = попе эе1(.баСа = () эе1с.рагепС.С!С1е("ВооКвагка - цппавеб") Если пользователю потребуется создать новый файл с закладками, мы сначала должны предоставить ему возможность сохранить имеющиеся изменения в текущем файле. Эта возможность реализована в виде отдельного метода Масла)!лбов. оКауТоСопС!пое(), потому что она будет использоваться в нескольких местах в программе, Метод возвращает Тгое, если можно продолжать создание файла, и Еа1эе — в противном случае.
Если можно продолжать, мы очищаем виджет списка, удаляя все записи — от первой до последней, где СК!п(ег, ЕИ — это константа, которая используется для определения последнего элемента в случаях, когда виджеты могут содержать несколько элементов. Затем сбрасывается флаг наличия изменений, имя файла и словарь с данными, поскольку новый файл еще пустой и никаких изменений еще не было сделано, а затем мы устанавливаем текст заголовка, отражающий тот факт, что был создан новый и еще не сохранявшийся файл. Переменная сцпоге хранит последовательность из нуля или более позиционных аргументов, которые нам не нужны. В случае когда метод вызывается в результате выбора пункта меню или щелчка на инструментальной кнопке, ему не передается никаких дополнительных аргументов, но в случае вызова по нажатию горячей комбинации клавиш (например, ССг(+(Ц) ему будет передаваться объект события, а поскольку мы не различаем, как именно пользователь вызывает данное действие, мы просто игнорируем объект события.
бес оКауТоСопС!пое(ае1Г): сс поС ае1с.бсггу: ге!иго Тгое гер1у = ск!псег.веааацееох.аакуеапосапое1( "Воохвагка — Опэахеб Спапцее", "Вахе опеанеб сьапцеа?", рагепс=ае1г.рагепс) сс гер1у са Папе: гесогп еа1ае сс гер1у: гесогп ае1(.сс!ецане() геСигп Тгие Если пользователь желает выполнить действие, которое приведет к очистке виджета списка (например, когда создается новый или открывается существующий файл), нам необходимо предоставить ему возможность сохранить любые несохраненные изменения. Если содержимое файла не изменялось, следовательно, отпадает необходимость выполнять сохранение и можно сразу же вернуть значение Тгое. В противном случае выводится стандартный диалог с сообщением, содержащий кнопки Уев (да), (Цо (нет) и Сансе( (отмена).
Если пользователь отменяет операцию, в переменную гер1у записывается значение Иоле, мы Глава !3, Введение в программирование граФического интерфейса трактуем это как то, что пользователь не хочет продолжать начатую операцию и не хочет сохранять изменения, и просто возвращаем значение Еа1ве. Если пользователь отвечает согласием, в переменную гер1ау записывается значение Тгье, поэтому мы даем пользователю возможность сохранить изменения и возвращаем Тгве, если изменения были сохранены и Еа1ве — в противном случае. Если пользователь ответил отказом, в переменную гер1ау записывается значение Еа1ве, что для нас означает отказ от сохранения изменений, но мы все равно возвращаем Тгье, потому что пользователь выразил желание продолжить операцию без сохранения изменений. Стандартные диалоги библиотеки ТК не импортируются инструкцией теро гт тН! псе г, поэтому для данного метода необходимо добавить инструкцию теро гт (Н!птег.
зеввасеЬок и инструкцию!врос! тН!птег, Е!1ес1а1оΠ— для следующего метода. В 1)(г[пс[очгв и Мас 03 Х используются стандартные диалоги этих операционных систем, а для других платформ используются диалоги, реализованные в самой библиотеке ТК. Мы всегда передаем диалогам ссылку на родительское окно, чтобы при вызове они автоматически располагались в центре родительского окна. Все стандартные диалоги являются медальными, то есть при появлении на экране они становятся единственным окном приложения, с которым пользователь может взаимодействовать, поэтому, чтобы получить возможность продолжить работу с приложением, пользователь должен закрыть их (щелчком на кнопке ОК (Готово), Орел (Открыть), Сапсе1 (Отменить) или подобной им). Модальные диалоги являются для программиста самой удобной разновидностью диалогов, так как пользователь лишен возможности изменить состояние программы, пока открыто окно диалога, поскольку модальный диалог блокирует приложение, пока не будет закрыт.
Слово «блокирует» здесь означает, что инструкция, следующая за вызовом модального диалога, выполнится, только когда диалог будет закрыт. Сет Гт)еБвчв(вв1(, .тспогв): 1( ве1(.Гт1епапв «в Ноле: гт1епаве = тн1птвг.гт1вста1ьс.авнвачеав(11епазв( т[т!е="Воовпагпв - Ваче Е11е", 1и!1!а1птг=".", 111втурев=[("Воькпагкв (11ев", " .ьаг")], Ьвтаи1техтепв1сп=".Ьат", рагеп(=вв1(.рагепт) гт пот Г!1впапе: гвтчгп Еа1ве ве1(.Г«1епаве = Г«1епаве [г пот ве1(.гт!впаэв.епсвнттп(".ьвГ'): ве11.(11епаае += ".Ьзт" тгу: н11П преп(ВВ1(.г(1епаае, енЬ") ав Гп: р!ЬН1е.виар(ве1т.дата, ГП, р1ЬК1Ь.Н16НЕБТ РЯОТОСО1) вв)Г.С(гту = Еа1ве Программы с главным окном 571 ае1(.аеСВСа(иаваг("Зачес (0) 1Сеаа Со (1)".Гогааг( 1еп(ае11. оаса), ае1п сс1епаае) ) ае1(.
рагепс, ссс!е("Вооквагка - (0)", согаас( оа.раСЬ.Ьааепаве(ае1Г.(11епаае))) ехсерс (епчсгопвепсеггог, рсск1е.рсск1ееггог) аа егг: скспсег.аеааацеЬох.аьовнагпшц("Воокаагка - Еггог", "Рас1ео со паче (О);ггп(1)".гогвас( ае1(.сс1епаае, егг), рагеп(=ае1(.рагепС) геСигп тгие Если имя текущего файла не задано, мы должны потребовать от пользователя выбрать имя файла. Если пользователь отменяет операцию, мы возвращаем Ра1ае, чтобы показать, что операцию следует отменить. В противном случае мы, если это необходимо, устанавливаем корректное расширение имени файла.
Используя существующий или создавая новый файл, мы сохраняем в файле словарь ае1г. ОаСа в законсервированном виде. После сохранения закладок мы сбрасываем признак наличия изменений, выводим сообщение в строку состояния (которое будет очищено через определенное время, в чем мы вскоре убедимся) и помещаем имя файла в заголовок окна (без пути к нему). Если попытка сохранить файл потерпела неудачу, мы выводим диалог с текстом предупреждения (в котором уже присутствует кнопка ОК), чтобы проинформировать пользователя о возникшей проблеме. оег аесцсасиаВаг(ае1(, сехс, 11аеоисе5000): ае1п асасиаьаг["секс"] = сехс 1( С1аеоиС: ае1г. асасиаьаг, агсег(ссаеоис, ае!г.
с1еагасасиаВаг) Этот метод выводит указанный текст в строке состояния и, если задано предельное время отображения (по умолчанию — пять секунд), метод запускает таймер однократного срабатывания, который очистит строку состояния по прошествии указанного времени. Се( Сс1еОреп(ае1П *сцпоге): 1( пос ае1(.окаутосопсьпие(): гесигп осг = (ов,раса.осгпаае(ае1с.т11епаае) [Г ае1(.111епаве 1а поС Иопе е1ае ".") (11епаае = СК(п(ег.(11есса1оц.аакареп(11епаае( ссс1е="Воокаагка — Ореп Рс1е", сп1(са1ссг=и1г, (с1егуреа=[("Воохаагкв Г11еа", "*,Ьвс")], Ое(аи1(ехгепа1оп=".Ьвк', рагеп(=ае1(.рагепС) сс Гс1епаве: ае1(. 1оаорс1е(сс1епаве) Этот метод начинается точно так же, как и метод Ма)ос)1поочг. (11енан(), предоставляя пользователю воэможность сохранить имеющиеся изменения или отменить операцию открытия файла.
Если пользоватсль подтверждает свое желание продолжить, мы стараемся предложить 572 Глава 13. Введение е программирование графического интерфейса пользователю рационально выбранный каталог, поэтому мы используем каталог, где находится текущий файл, если таковой имеется; в противном случае — текущий рабочий каталог. Аргумент (11етурев — это список (описание и маска) кортежей из двух элементов, которые отображаются диалогом выбора файла.
Если пользователь выберет имя файла, мы запоминаем его выбор и вызываем метод 1ааоЕ11е(), который прочитает содержимое файла. Создание отдельного метода 1оадЕ11е(), позволяющего загружать файлы без привлечения внимания пользователя, — это обычная практика. Например, некоторые программы на запуске автоматически загружают последний использовавшийся файл, а некоторые программы даже сохраняют список последних использовавшихся файлов в виде пунктов меню, чтобы при выборе любого из таких пунктов напрямую вызывался бы метод 1оаоЕ(1е() с именем файла, ассоциированным с выбранным пунктом меню. ает 1оааЕ11е(ве1Г, Г(1епаве), ве1(.Г!1епаве = Г11епаве ве1(. 1(втВох,ае1ете(0, ТК1птег.ЕЗВ) ве1(.а(гту = еа1ве тгу: нттп орел(ве1(.Г11епаве, "гЬ") ав ГП: ве1(.пата = р(ск1е, 1оао((ь) гог паве вп вогтео(ве1(.пата, кеу=втг.)авег): ве1(.
11втВох. 1пвегт(тк1птег.езр, паве) ве1(.ветвтатавВаг(тьаасеа (О) Ьооквагхв (гав (1)".Гогват( ве1(. 1!втВах.в1ае(), ве1(.гт1епаве)) ве1(.рагепп ттт1е("Воохвагхв — (О)".Гогват( ов.рата.аавепаве(ве1(.тт1епаве))) ехсерт (Епу1гопвептЕггог, р1сК1е.Р1сК1еЕггог) ав егг; тк1птег,веввадеЬох,вповвагп(пд("Вооквагхв - Еггог", "Еа(1еа то 1оаа (0).1п(1)".Гогват( ве1(.(11епаве, егг), рагепт=ве1(.рагепт) Когда этот метод вызывается, то точно известно, что любые изменения уже были сохранены или отвергнуты, поэтому можно очистить виджет списка.