Разработка web-приложения. ЛР по ВТП для ВТ (Питон). Методические указания к лабораторным работам для студентов, обучающихся в бакалавриате по направлениям
Скачать 2.07 Mb.
|
Разработка менюЦель работы: изучение и закрепление на практике основ конструирования структур меню и связывания их с действиями в Python-проектах. Введение Меню стало стандартным элементом Windows-программ, поэтому язык Python содержит эффективные средства их создания и использования в составе проектов. Находится оно под строкой заголовка и представляет собой выпадающие списки под словами-пунктами меню. Пункты конечных списков представляют собой команды, обычно выполняющие какое-либо действия или открывающие диалоговые окна. В tkinter экземпляр меню создается от класса Menu, далее его надо привязать к виджету, на котором оно будет расположено. Обычно таковым выступает главное окно приложения. Его свойству menu присваивается экземпляр Menu через имя связанной с экземпляром переменной. В приложении может быть несколько главных меню, но активным является всегда одно. Переключение между меню производится командой root.config(menu=<название_главного_меню>). from tkinter import * root = Tk() mainmenu = Menu(root) root.config(menu=mainmenu) root.mainloop() Если выполнить данный код, то никакого меню пока не видно. Появится только тонкая полоска под заголовком окна, ведь ни одного пункта меню не было создано. Метод add_command() добавляет пункт меню: … mainmenu.add_command(label='Файл') mainmenu.add_command(label='Справка') … В данном случае "Файл" и "Справка" – это опции главного меню. К ним можно добавить свойство command, связав тем самым опцию с какой-либо функцией-обработчиком клика. Хотя такой вариант меню имеет право на существование, в большинстве приложений панель главного меню содержит выпадающие списки команд, а сами опции на панели командами по сути не являются. Клик по ним приводит лишь к раскрытию соответствующего списка. В tkinter проблема создания выпадающих списков и подвязывания их к главному меню решается с помощью метода add_cascade(). Листинг 2.1 from tkinter import * root = Tk() mainmenu = Menu(root) root.config(menu=mainmenu) f ilemenu = Menu(mainmenu, tearoff=0) filemenu.add_command(label="Открыть...") filemenu.add_command(label="Новый") filemenu.add_command(label="Сохранить...") filemenu.add_command(label="Выход") helpmenu = Menu(mainmenu, tearoff=0) helpmenu.add_command(label="Помощь") helpmenu.add_command(label="О программе") mainmenu.add_cascade(label="Файл", menu=filemenu) mainmenu.add_cascade(label="Справка", menu=helpmenu) root.mainloop() В результате будет создано следующее дерево меню (рис. 2.1): Анализ листинга 2.1 и рис. 2.1 показывает, что дерево меню в модуле tkinter строится снизу вверх, поэтому целесообразно перед началом конструирования его построить графически целиком, а потом переходить к реализации. На основное меню (mainmenu), добавляются не команды, а другие меню. У выпадающих меню filemenu и helpmenu в качестве родительского виджета указывается не root, а mainmenu. Команды обычно уже к дочерним меню. Значение 0 параметра tearoff отключает возможность открепления подменю, иначе его можно было бы делать плавающим кликом мыши по специальной пунктирной линии (в случае tearoff=0 она отсутствует). Точно также можно подвязывать дочерние меню к filemenu и helpmenu, создавая многоуровневые списки пунктов меню. … helpmenu = Menu(mainmenu, tearoff=0) helpmenu2 = Menu(helpmenu, tearoff=0) helpmenu2.add_command(label="Локальная справка") helpmenu2.add_command(label="На сайте") helpmenu.add_cascade(label="Помощь", menu=helpmenu2) helpmenu.add_command(label="О программе") … Теперь меню будет трехуровневым (рис. 2.2): Метод add_separator() добавляет линию разделитель в меню. Используется для визуального разделения групп команд. Для связи опции меню с действиями используется её свойство: command = <функция> Наиболее часто привязка горячих клавиш к опции меню имитируется следующим образом: дублируется функция, запускаемая опцией меню, и создается событие для ее запуска в виде нажатия горячих клавиш, которое привязывается к форме. … def zan(): b1["text"] = 'Самолет' … sgrmenu.add_command(label="Транспорт: … def zan1(event): b1["text"] = 'Самолет' root.bind(' … В примере предполагается, что функция zan запускается опцией меню "Транспорт". Эта же функция дублируется и запускается сочетанием горячих клавиш Привязка пиктограмм к опциям меню реализуется по следующему алгоритму: 1. Создается объект, в который загружается файл пиктограммы. Для этого можно использовать графический элемент PhotoImage. im = PhotoImage(file = 'smiley.gif') 2. Объект привязывается к требуемой опции меню sgrmenu.add_command(label="Пассажирские", image = im, compound="left" ) Анализ этой последовательности показывает, что она аналогична загрузке изображения на кнопку Button, рассмотренной в лабораторной работе №1. Еще один важный аспект формирования меню программного приложения - создание контекстного меню. В этом случае экземпляр меню привязывается не к родительскому виджету, а к меню применяется метод post(), аргументами которого являются координаты того места, где должно появляться меню. В примере контекстное меню используется для смены размера шрифта на кнопке. Для этого: 1. Создается набор функций, каждая из которых устанавливает свое значение шрифта: def f12(): b1["font"] = "Arial 12" def f15(): b1["font"] = "Arial 15" def f18(): b1["font"] = "Arial 18" def f21(): b1["font"] = "Arial 21 2. Создается набор опций контекстного меню, каждая из которых активизирует одну из этих функций. v = IntVar() pm = Menu(tearoff=0) pm.add_checkbutton(label="12", variable = v, onvalue = 0, offvalue=0, command=f12) pm.add_checkbutton(label="15", variable = v, onvalue = 1, offvalue=0, command=f15) pm.add_checkbutton(label="18", variable = v, onvalue = 2, offvalue=0, command=f18) pm.add_checkbutton(label="18", variable = v, onvalue = 3, offvalue=0, command=f21) Метод add_checkbutton добавляет к опции свойство checked, т.е. возможность отображения текущего выбора в виде 'галочки’. Именно переменная v = IntVar() объединяет все четыре опции в одну группу, т.е можно создавать несколько разных контекстных меню с разными связующими переменными. У все опций разное значение переменной onvalue. 3. Производится привязка контекстного меню к конкретному месту интерфейса. Для этого используются методы event.x и event.y x1 = event.x y1 = event.y который сообщают текущие координаты в локальной системе того виджета, над которым находится мышь. А далее, если выполняется требуемое условие, с помощью метода post() происходит отображение контекстного меню. def pom(event): x1 = event.x y1 = event.y if (x1 > 0 and x1 < 111) and (y1 > 0 and y1 < 24): pm.post(event.x_root, event.y_root) b1.bind(" Но место меню уже указывается в абсолютных координатах всего экрана event.x_root и event.y_root. При этом надо учитывать, что размер некоторых виджетов может меняться в ходе работы программы, т.е. для корректности надо адаптивно менять размеры области, доступной для вызова контекстного меню. Для временной дезактивации некоторой опции меню в ее свойствах указывается state = DISABLED. Выполнение лабораторной работы На основании иерархии объектов предметной области, заданной вариантом в табл. 7.2, сформировать главное меню проекта. В меню должно быть не менее 20 опций и четырех уровней, причем две любые опции должны быть дополнены графическими пиктограммами. В составе меню должна быть разделительная линия, логически отделяющая одну группу оаций от другой. Таблица 2.1
2. У двух конечных опций должны быть горячие клавиши. Выбор одной из таких опций приводит к: для четных номеров варианта: появление в центре метки с фамилией студента; для нечетных – появление в окне однострочного редактора фамилии студента. Выбор другой такой опции приводит к исчезновению вышеуказанного текста. 3. Создать контекстное меню, привязанное к редактору или метке с фамилией студента, в зависимости от варианта. В меню пять опций: для четных номеров – для выбора цвета текста, для нечетных – для задания размера шрифта текста. Выбор опции сопровождается установкой рядом с ней метки и стирания предыдущей метки. 4. Работу программы показать преподавателю. Содержание отчета: Титульный лист установленной формы; Задание на выполнение лабораторной работы; Структура проекта; Блок-схема начальной установки, блок-схемы процедур. 5) Листинг программы. Контрольные вопросы 1) Можно ли спроектировать контекстное меню из нескольких столбцов? 2) Можно ли для одного компонента создать несколько контекстных меню? 3) Какие события связаны с опциями меню? 4) Какие графические изображения можно размещать в меню? 5) Как создать разделительные линии в меню? Лабораторная работа № 3 Разработка усложненного Python-проекта Цель работы: изучение свойств и методов использования дополнительного набора компонентов, применяемых для формирования графического пользовательского интерфейса в Python-приложениях. Введение В дополнение к тем виджетам, которые рассмотрены в лабораторных работах 1 и 2, модуль tkinter включает ряд визуальных компонентов, широко используемых для формирования пользовательских интерфейсов программных приложений. SpinBox Данный виджет используется для задания конкретного численного значения из заданного перечня. Для создания спинбокса используется класс Spinbox: spin = Spinbox(root, from_=0, to=100) Перечень значений можно задавать двумя способами: указанием граничных значений диапазона; перечислением возможных значений. Выше представлен первый вариант задания, где параметры from_=0, to=100 задают границы диапазона. Разрешается просто перечислить для Spinbox диапазон возможных значений следующим образом: spin = Spinbox(window, values=(3, 8, 11), width=5) Тогда виджет будет отображать только эти 3 числа: 3, 8 и 11. Кроме того, можно указать ширину виджета с помощью параметра width. Также можно задать значение по умолчанию для Spinbox. Для этого надо передать это значение параметру textvariable следующим образом: var = IntVar() var.set(36) spin = Spinbox(window, from_=0, to=100, width=5, textvariable=var) Параметр textvariable определяет переменную (в данном случае var), через которую считывается или устанавливается текущее значение виджета. |