Саммерфилд - Программирование на Python 3 (1077331), страница 125
Текст из файла (страница 125)
В изучении и использовании все они более простые, чем Т)с, и для всех имеется гораздо больше документации, ориентированной на программистов, использующих язык РуФ)топ, чем для Т)с. В общем случае программы, использующие РуС()с, Руч$ или чгхРуФ)топ, получаются более короткими и дают более качественный результат, нежели программы, использующие Т1с.
И все же, несмотря на все ограничения и недостатки, библиотеку Т)с можно использовать для создания полезных программ с графическим интерфейсом — среда разработки 1ЭЬЕ является наиболее известным в мире РуФ)топ подтверждением этих слов. Кроме того, во время написания этой книги появились признаки оживления в разработке библиотеки Т)с. Начиная с версии 8.5, в библиотеке была реализована поддержка тем оформления, что обеспечивает большее сходство графического интерфейса программ с графическим интерфейсом операционной системы, а также появилось множество новых виджетов. Цель этой главы состоит в том, чтобы дать вам общее представление о программировании с применением библиотеки Т)с. При необходимости разработки серьезного графического интерфейса лучше не обращаться к материалу этой главы (так как в ней демонстрируются устаревшие подходы к использованию библиотеки Т)с для создания графического интерфейса) и воспользоваться одной из альтернативных библиотек.
Но если Т)с — единственная доступная для вас возможность, то вам определенно следует изучить язык Тс1, чтобы иметь возможность читать документацию для библиотеки Т1с. В следующих разделах мы создадим две программы с графическим интерфейсом с использованием библиотеки Т)с. Первая, очень маленькая программа, в форме диалога, позволяет вычислять сложные проценты по банковским вкладам. Вторая программа — более сложная, она имеет главное окно и управляет списком закладок (имена и адреса с)К) ). Благодаря использованию таких простых данных мы можем сконцентрировать все свое внимание на программировании графического интерфейса, не отвлекаясь на посторонние детали, В процессе обзора программы управления закладками мы увидим, как создавать свои собственные диалоги и как создавать главное окно программы, с полосой меню и панелями инструментов, а также как все это соединить в единую полноценную работающую программу.
Но для начала нам необходимо рассмотреть некоторые основные принципы программирования графического интерфейса, поскольку они существенно отличаются от принципов создания консольных программ. Консольные программы на языке РуФЬоп и файлы модулей всегда имеют расширение.ру, но для файлов программ с графическим интерфейсом используется расширение .руи (однако для файлов модулей всегда используется только расширение .ру). Для операционной системы Программы в виде диалога 1 ьппх нет никакой разницы между расширениями .ру и .руга, но в чгьгш бочов расширение .руга ассоциировано не с выполняемым файлом интерпретатора ругаон.ехе, а с русаоаиг.ехе, вследствие чего при запуске программы на языке РуФТьоп с графическим интерфейсом не будет появляться окно консоли.
В операционной системе Мас ОЯ Х похожая ситуация — для файлов программ с графическим интерфейсом используется расширение .руга. Когда запускается программа с графическим интерфейсом, она обычно начинает с того, что создает главное окно и все виджеты главного окна, такие как полоса меню, панели инструментов, центральная область и строка состояния. После создания окна программа с графическим интерфейсом, подобно серверной программе, переходит в режим ожидания.
Однако если серверная программа ожидает получения запросов от программ-клиентов, то программа с графическим интерфейсом ожидает некоторых действий пользователя, таких как щелчок мышью или нажатие клавиши. Эти различия между консольными программами и программами с графическим интерфейсом изображены на рис. 13.1. Но программа с графическим интерфейсом не просто пассивно ожидает, она выполняет цикл обработки событий, алгоритм работы которого на псевдокоде выглядит, как показано ниже: Типичная консольная программа Рис.
13.1. Консольная арограмма и арограмма с графическим интерфейсом Программы з виде диалога логов используются классы, а большинство виджетов, содержащихся в окне, являются экземплярами стандартных виджетов, таких как кнопки или флажки, предоставляемые библиотекой. Как и большинство кросс-платформенных библиотек графического интерфейса, библиотека Т)с в действительности не различает главное окно и виджеты, окно — это обычный виджет, который не имеет родительского виджета (то есть он не содержится внутри другого виджета). Виджеты, не имеющие родительского виджета (окна), автоматически снабжаются рамкой и прочими визуальными атрибутами окна (такими как строка заголовка и кнопка закрытия окна) и, как правило, содержат другие виджеты.
В большинстве своем виджеты создаются как дочерние по отношению к другим виджетам (и содержатся внутри своих родительских виджетов), а окна создаются как дочерние виджеты объекта 1 Кап(ег, ТК. Этот объект обычно концептуально представляет приложение. Помимо разделения на виджеты и окна (которые также называются виджетами верхнего уровня), отношения родитель-потомок обеспечивают корректный порядок удаления виджетов и автоматическое удаление всех дочерних виджетов при удалении родительского виджета. Метод инициализации служит местом, где создается пользовательский интерфейс (создаются и размещаются виджеты, выполняется привязка клавиатуры н мыши), а другие методы используются для обработки действий пользователя. Библиотека Т)с позволяет создавать собственные виджеты либо посредством создания подклассов предопределенных виджетов, таких как 1К1пгЕг. ггазЕ, либо посредством создания обычных классов и добавления в них виджетов в виде атрибутов.
В первом примере мы будем создавать свои подклассы, а в следующем будут применены оба подхода. Так как программа 1п(егез1 имеет единственное главное окно, она реализована в виде единственного класса. Начнем разбор с метода инициализации, разбитого на пять частей, так как он достаточно длинный.
с1ааа магпгг)поог«(гк1п1ег.»газа): сап 1паг (аа1Г, рагепг): аорег(иаапи1поою, ав1г). апы (рагап1) аа1Г.рагеп1 = рагап1 аа1Г.Ог1О(гоп=о, со1иап=с) Сначала вызывается метод инициализации базового класса. (В идеале можно было бы вызвать метод как аорег(). 1п!1 (рагепг), но к моменту написания этих строк такой способ уже не работал, поэтому вызывается функция аорег() с базовым классом и объектом зе1г в виде явно передаваемых аргументов.) Затем сохраняется копия родительского виджета для последующего использования. Виджеты располагаются внутри других виджетов с помощью менеджеров компоновки, а не с помощью абсолютных координат и размеров. Вызов метода О г)г) () помещает окно внутрь менеджера компоновки типа «сетка».
Каждый Глава !3. Введение а программирование графического интерфейса отображаемый виджет должен быть помещен в менеджер компоновки, даже виджет верхнего уровня. Б библиотеке Т)с имеется несколько менеджеров компоновки, но менеджер типа «сетка» является наиболее простым в использовании, хотя для виджетов верхнего уровня, чтобы добиться того же эффекта, можно было бы использовать менеджер компоновки типа «мозаика» (рас)тег), вызвав метод расК() вместо дг!О(гон=0, со1ивп=О).
веы.рг!пс1ра1 = СК!птег.ОсчЫеуаг() ве!С.ргспс1ра1.вес(!000.0) ве1Г гасе = СК1псег.ОсчЫеуаг() ве!г.гасе.вес(5.0) ве!т.уеагв = СК1птег. 1птуаг() ве1(.аасчпс = Скспсег.5смпдуаг() Библиотека Т)с позволяет создавать переменные, ассоциированные с виджетами. Если значение переменной изменяется программным способом, изменения тут же отражаются в соответствующем ей виджете, и точно так же, если пользователь изменяет значение в виджете, изменяется значение в ассоциированной переменной.
Здесь были созданы две переменные типа «с)ои)т)е» (они хранят значения типа (1оаС), целочисленная переменная, строковая переменная и заданы начальные значения в двух из них. рг!пссра1(аЬе1 = СК1псег. СаЬе1(ве1Г, Сехс="Рг1пссра1 3:", апсьсг=ск1псег и, епсег1спе=О) рг1пссра15са!е = СКсптег.дса1е(ве1Г, чагсаЫе=ве1т.рг1пс!ра1, совпапе=ве1т.ореаседс, Ггев =100, Со=10000000, гевс1ис!Ьп»100, сг!епс=сК!птег.НОЙ120МТАС) гата(аее1 = СК!пСег.(аЬе1(ве1Г, СехС="йасе %:", ипеег11пе=О, апсппг=скспсег.И) гасе5са1е = СКсптег.вса1е(ве1Г, чаг!аЫе=ве1т.тате, сопаапс=ве1г.арса!ад!, ггсп =1, со=100, гевс1ит!оп=0.25, С!д!Се=5, смел!=СКспсег НОН120МТАС) уеагв(аее1 = СК!птег.(аЬе1(ве1Г, Сехс="уеагв:", епеег!тле=О, апспсг=ск!псег.н) уеагв8са1е = СК!пСег.8са1е(ве1Г, чаг!аЫе=ве1(.уеагв, саазала=ве1(.чраате01, (гоп =1, Со=50, ог!епс=СКсгсег,НОН120МТАЬ) аесиптсаее1 = Сксптег.(аее1(ве1(, техт="Апсчпс 3", апспсг=сК!псег.Х) астиа1Аасчпссасе1 = СКспСег.(аЬе1(ве1Г, тех!час!аЫе=ве!т.аасппт, гЕ1!ет=схсптег.БОМКЕМ, апсЬсг=сКспсег.Е) Б этой части метода инициализации создаются виджеты.
Биджет СК!птег. ЕаЬе1 используется для отображения текста, доступного только для чтения. Как и в случае любых других виджетов, при его создании определяется родительский виджет (в данном случае, как и в любом другом, родителем является содержащий его виджет), а затем через именованные аргументы задаются настройки различных аспектов Программы в виде диалога поведения виджета и его внешнего вида.
Для виджета рг!пс!ра1Еаве1 мы определили отображаемый им текст, а в аргументе апсвог передали значение !К!и!ег, И, которое означает, что текст метки будет выравниваться по западному (и ее!), то есть по левому краю. Аргумент ьпдег!!пе определяет, какой символ в тексте будет использоваться для обозначения горячей клавиши (например, Ай+Р); далее будет показано, как работать с горячими клавишами.
(Горячая клавиша — зто комбинация клавиш вида Ай+символ, где сиивол — это подчеркнутый символ метки; при нажатии горячей клавиши фокус ввода передается виджету, ассоциированному с горячей клавишей, обычно расположенному правее или ниже метки, в которой определен символ горячей клавиши.) Виджетам ск!псег. Зса1е передается в качестве родителя, как обычно, объект ае1! и ассоциированная с каждым из них переменная. Кроме того, в аргументе соввапс им передаются ссылки на объекты функций (в данном случае методы).
Эти методы будут вызываться автоматически при каждом изменении положения движка, устанавливаются минимальное (имя аргумента (гоа записывается с завершающим символом подчеркивания, потому что ггои — это зарезервированное ключевое слово) и максимальное (Сс) значения и определяется горизонтальная ориентация. Для некоторых движков указывается разрешение (геао1ш!Оп) — шаг изменения значений, а для гасеЯса1е — еще и число отображаемых цифр.