Принципы создания приложений с GUI — КиберПедия 

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Принципы создания приложений с GUI

2019-06-06 387
Принципы создания приложений с GUI 0.00 из 5.00 0 оценок
Заказать работу

Создание графических приложений позволяет сделать программу более наглядной и понятной для независимого пользователя. Ему не нужно вникать в смысл каждой строки программы и не нужно разбираться, где поменять входные данные.

Приложения MATLAB являются графическими окнами, содержащими элементы управления (кнопки, списки, переключатели, флаги, полосы скроллинга, области ввода, меню), а также оси и текстовые области для вывода результатов.

Приложения – GUI (graphical user interfaces – графические пользовательские интерфейсы) создаются в среде GUIDE (рис. 15). Для запуска этой среды нужно нажать пиктограмму GUIDE в панели command window или набрать guide в командной строке. Далее во вкладке Create New Gui выбираем Blank GUI.

 

Рис. 15. Среда GUIDE MATLAB

 

Редактор GUIDE содержит:

- строку меню;

- панель инструментов управления (вверху);

- заготовку окна приложения с нанесенной сеткой;

- вертикальную и горизонтальную линейки прокрутки;

- панель инструментов объектов интерфейса (слева) (рис. 16)

Рис. 16. Панель инструментов для создания интерфейса

 

Создадим простое приложение, содержащее оси и две кнопки «построить график» и «очистить график». Сначала выберем Axes из панели инструментов и разместим их в центре окна. Затем выберем две кнопки Push Button и разместим их под графиком. При нажатии на кнопку правой клавиши мыши вызовем инспектор свойств Property Inspector. В нем выберем свойство String и впишем «Построить» и свойство Tag и впишем btnplot.

Удобно задавать имена, часть которых соответствует типу объекта управления. Для второй кнопки в поле свойства String внесем «Очистить», а в поле свойства Tag – btnclear (рис. 17). Свойство String соответствует надписи на кнопке, а свойство Tag соответствует имени или тегу объекта в программе.

Затем сохраним файл и запустим программу, но при нажатии на кнопки ничего не происходит, так как не прописана обработка событий.

При сохранении GUI приложения автоматически генерируется m-файл, в котором необходимо прописывать обработку событий при нажатии на кнопку. Для этого в файле найдем функцию обработки событий при нажатии на кнопку «Построить» и пропишем построение графика.

 

Рис. 17. Окно приложения с двумя кнопками

 

function btnplot_Callback(hObject, eventdata, handles)

% hObject handle to btnplot (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

x=[-2:0.2:2];

y=exp(-x.^2);

plot(x,y)

 

Обработка события при нажатии на кнопку «Очистить» c помощью функции cla (clear axes).

 

function btnсlear_Callback(hObject, eventdata, handles)

% hObject handle to btnlear (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

cla

 

Управлять свойствами объектов можно в m-файле. Сделаем так, чтобы в любой момент времени была доступна только одна кнопка. Если графика нет, то доступна кнопка «Построить», если график нарисован, то доступна кнопка «Очистить». Это делается с помощью свойства «Enable» - значение on – разрешает доступ, off – запрещает. Установка нужных свойств устанавливается функцией set. При изменении свойств любого объекта используем указатель на этот объект handles.

 

function btnplot_Callback(hObject, eventdata, handles)

% hObject handle to btnplot (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

x=[-2:0.2:2];

y=exp(-x.^2);

plot(x,y)

% кнопка должна быть недоступной после вывода графика

set (hObject, 'Enable', 'on')

% кнопка «Очистить» должна стать доступной

set (handles.btnclear, 'Enable', 'off')

% --- Executes on button press in btnclear.

function btnclear_Callback(hObject, eventdata, handles)

% hObject handle to btnclear (see GCBO)

% eventdata reserved-to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

cla

% кнопка должна быть недоступной после очистки осей

set (hObject, 'Enable', 'on')

% кнопка «Построить» должна стать доступной

set (handles.btnplot, 'Enable', 'off)

 

Теперь разместим в окне приложения два флажка (check box). Один будет управлять сеткой по оси Х, а другой – сеткой по оси Y. В свойствах установим в String – сетка по Х или сетка по Y, в свойстве Tag – chbxGridX и chbxGridY. Нас интересует еще свойство Value, которое принимает значение 1 при включении флага и 0 при выключении.

Сделаем так, чтобы при нажатии пользователем кнопки «Построить» происходило отображение линий сетки в зависимости от установленных флагов, а нажатие кнопки «Очистить» приводило к скрытию сетки. Блок обработки события Callback кнопки «Построить» нужно дополнить проверкой состояния флагов. Указатели на флаги содержатся в полях chbxGridX и chbxGridY структуры handles. Состояние флагов определяет значение свойств XGrid и YGrid осей.

 

function btnplot_Callback(hObject, eventdata, handles)

% hObject handle to btnplot (see GCBO)

% eventdata reserved-to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

51

x=[-2:0.2:2];

y=exp(-x.^2);

plot(x,y)

% проверка флага Сетка по Х

if get (handles.chbxGridX, 'Value')

% флаг включен, строим сетку по Х

set (gca, 'XGrid','on')

else

% флаг выключен, убираем сетку по Х

set (gca, 'XGrid','off ')

end

% проверка флага Сетка по Y

if get (handles.chbxGridY, 'Value')

% флаг включен, строим сетку по Y

set (gca, 'YGrid','on')

else

% флаг выключен, убираем сетку по Y

set (gca, 'YGrid','off ')

end

 

Смена состояния флагов сетки не приводит к немедленным изменениям на графике. Необходимо проверять состояние флагов для отображения или скрытия сетки.

 

function chbxGridX_Callback(hObject, eventdata, handles)

% hObject handle to chbxGridX (see GCBO)

% eventdata reserved-to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of chbxGridX

% проверка флага по оси Х

if get (hObject, 'Value')

% флаг включен, следует добавить линии сетки

set (gca, 'XGrid', 'on')

else

% флаг выключен, следует убрать линии сетки

set (gca, 'XGrid','off ')

end

% --- Executes on button press in chbxGridY.

function chbxGridY_Callback(hObject, eventdata, handles)

% hObject handle to chbxGridY (see GCBO)

% eventdata reserved-to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of chbxGridY

% проверка флага по оси Y

if get (hObject, 'Value')

% флаг включен, следует добавить линии сетки

set (gca, 'YGrid', 'on')

else

% флаг выключен, следует убрать линии сетки

set (gca, 'YGrid','off ')

end

 

Приложение после проделанных изменений выглядит следующим образом (рис. 18).

 

Рис. 18. Пользовательский интерфейс

 

Флаги предоставляют возможность выбора одной или сразу нескольких опций. Одновременный выбор только одной опции осуществляется при помощи переключателей.

Переключатели группируются по назначению. Применим переключатели для выбора типа маркера (кружок, квадрат или отсутствие маркера).

Добавьте в окно приложения три переключателя и установите свойствам Tag значения rbMarkCirk, rbMarkSq, rbMarkNone, а String – маркеры-круги,

маркеры-квадраты и без маркеров (рис. 19).

 

Рис. 19. Добавление переключателей

 

Состояние переключателя определяется свойством Value, если Value равно 1, то переключатель включен, нулю – выключен. Можно установить необходимые первоначальные значения этого свойства. Дальнейшее управление значением переключателей осуществляется программно. Если происходит переключение одного из radio button, то изменяется тип маркеров линии и выключаются два остальных переключателя. Изменение типа маркера происходит при обращении к свойству линии Marker. Указатель на линию возвращает plot в выходном аргументе.

 

function btnplot_Callback(hObject, eventdata, handles)

% hObject handle to btnplot (see GCBO)

% eventdata reserved-to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

x=[-2:0.2:2];

y=exp(-x.^2);

% запись указателя в поле line структуры handles

handles.line=plot(x,y);

% сохранения структуры handles для использования в других подфункциях

guidata (gcbo, handles);

 

Обработка событий переключателя выглядит следующим образом.

 

function rbMarkCirc_Callback(hObject, eventdata, handles)

% hObject handle to rbMarkCirc (see GCBO)

% eventdata reserved-to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of rbMarkCirc

% выбран переключатель маркеры-круги

set (handles.line,'Marker','o') % размещение маркеров-кругов на линии

% установка остальных переключателей в положение выключено

set (handles.rbMarkSq, 'Value', 0)

set (handles.rbMarkNone, 'Value', 0)

% --- Executes on button press in rbMarkSq.

function rbMarkSq_Callback(hObject, eventdata, handles)

% hObject handle to rbMarkSq (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of rbMarkSq

% выбран переключатель маркеры-квадраты

set (handles.line,'Marker','s') % размещение маркеров-квадратов на линии

% установка остальных переключателей в положение выключено

set (handles.rbMarkCirc, 'Value', 0)

set (handles.rbMarkNone, 'Value', 0)

% --- Executes on button press in rbMarkNone.

function rbMarkNone_Callback(hObject, eventdata, handles)

% hObject handle to rbMarkNone (see GCBO)

% eventdata reserved-to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA

% Hint: get(hObject,'Value') returns toggle state of rbMarkNone

% выбран переключатель без маркеров

set (handles.line,'Marker','none') % удаление маркеров с линии

% установка остальных переключателей в положение выключено

set (handles.rbMarkSq, 'Value', 0)

set (handles.rbMarkCirc, 'Value', 0)

 

Проверьте работоспособность приложения. Маркеры линии меняются, но имеются некоторые недостатки интерфейса. Во-первых, при изменении маркеров на пустых осях MATLAB выдает ошибку обращения к несуществующему объекту. Во-вторых, нажатие на кнопку «Построить» приводит к построению графика без маркеров вне зависимости от установленного переключателя. И, наконец, повторный щелчок на переключатель приводит к его выключению, но всегда должен быть включен один из переключателей.

Первый недостаток устраняется при запрещении доступа к переключателям, если нет линии на графике и разрешении его после ее появления.

Это делается в функциях обработки событий при нажатии на кнопки «Построить» и «Очистить». Нужно установить свойство Enable в нужное значение ‘on’ или ‘off’. При запуске приложения все переключатели должны быть недоступны, так как пользователь еще не построил график функции.

Для того чтобы при построении графика тип маркера отвечал установленному переключателю, нужно при обработке события при нажатии на кнопку «Построить» включить опрос переключателей.

Для того чтобы всегда был активным один переключатель и при повторном щелчке он не выключался, нужно воспользоваться еще одним возможным значением свойства Enable – inactive. Переключатель со значением inactive выглядит в рабочем положении как доступный переключатель, но попытка его изменить не приводит к успеху. Необходимо проделать следующие изменения в программе:

1. Свойство Enable переключателя, событие которого обрабатывается, должно иметь значение inactive свойства Enable, а для остальных двух on.

2. При нажатии на кнопку «Построить» свойству Enable всех переключателей присваивается значение on, а затем определяется установленный в данный момент переключатель и в Enable заносится inactive.

Альтернативный способ выбора пользователем только одной из предлагаемых опций реализуется с помощью раскрывающегося списка.

Добавим в интерфейс возможность выбора цвета линии графика из раскрывающегося списка (синий, красный, зеленый). Перейдите в режим редактирования и добавьте при помощи панели управления раскрывающийся список. В свойстве Tag запишите pmColor, в свойстве String - синий, красный, зеленый (рис. 20).

 

 

Рис. 20. Окно String

Обработка события Callback раскрывающегося списка состоит в определении выбора пользователя и соответствующем изменении цвета линии. Свойство списка Value содержит номер выбранной строки. С помощью оператора Switch устанавливают цвет линии в зависимости от номера выбранной строки списка.

 

function pmColor_Callback(hObject, eventdata, handles)

% hObject handle to pmColor (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hints: contents = get(hObject,'String') returns pmColor contents as cell array

% contents{get(hObject,'Value')} returns selected item from pmColor

% определение номера строки

N=get(hObject,'String');

switch N

case 1

% выбрана первая строка, делаем линию синей

set (handles.line,'Color','b');

case 2

% выбрана вторая строка, делаем линию красной

set (handles.line,'Color','r');

case 3

% выбрана вторая строка, делаем линию зеленой

set (handles.line,'Color','g');

end

 

Проверьте, меняется ли цвет линии графика. Но в таком виде интерфейс имеет ряд недостатков.

1. Повторное построение графика не учитывает текущий выбор цвета в раскрывающемся списке.

2. Выбор цвета на несуществующем графике приводит к ошибке.

3. Список нужно озаглавить.

 

Первый недостаток устраняется следующим образом. Необходимо добавить в функцию обработки события при нажатии на кнопку «Построить» опрос состояния раскрывающегося списка.

Второй недостаток устраняется, если запретить доступ пользователя к списку при отсутствии графика и разрешить при его появлении.

Третий недостаток устраняется с помощью добавления в интерфейс статического текста.

Теперь работающее приложение выглядит так (рис. 21).

 

Рис. 21. Добавление раскрывающегося списка и статического текста

 

Используем полосу скроллинга для изменения толщины линии графика. Добавим ее на поле интерфейса и внесем изменения в свойство Tag – scrWidth. Добавим пояснительный текст Static Text – «Толщина линии». В инспектор свойств вносим изменения:

1. Максимальное значение max – 10, минимальное значение min-1.

Определяются границы изменения Value при перемещении бегунка.

2. Начальное положение Value установить равным 1.

3. Свойство SliderStep определяет, насколько значение Value изменяется при нажатии на кнопки со стрелками (первое значение) и при перетаскивании бегунка мышью (второе значение) (рис. 22).

 

Рис. 22. Изменение свойств Slider

 

Теперь нужно ввести обработку событий при обращении к скроллингу. Округленное значение свойства Value будет определять значение толщины линии.

Изменение в тексте программы

 

function scrWidth_Callbac(hObject, eventdata, handles)

% hObject handle to scrWidth (see GCBO)

% eventdata reserved-to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'Value') returns position of slider

% get(hObject,'Min') and get(hObject,'Max') to determine range of slider

% получение толщины линии в зависимости от положения бегунка скроллинга

w=get(hObject,'Value')

% установка толщины линии

set (handles.line,'LineWidth', round(w))

 

Теперь интерфейс будет выглядеть следующим образом (рис. 23).

 

 

Рис. 23. Добавление в интерфейс Slider

 

Таблица 6. Описание свойств объектов

 

Рис. 24. Интерфейс с изменяющимся и статическим текстом

Рассмотрим пример интерфейса для ввода цифровых значений, их обработки и вывода результата.

Создадим интерфейс, содержащий 4 элемента Static Text, 4 элемента Edit Text и кнопку Push Button (рис. 24 и табл. 6).

Для обработки событий в программе необходимо произвести следующие изменения. Для использования в программе числа, вводимого в поле а=, необходимо в функции edit_a_Callback добавить следующие строки:

 

function edit_a_Callback(hObject, eventdata, handles)

% hObject handle to edit_a (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_a as text

% str2double(get(hObject,'String')) returns contents of edit_a as a double

% преобразуем строку в вещественное число и присваиваем его переменной а

a=str2double(get(hObject,'String'));

% создаем указатель на переменную а

handles.a=a;

% сохраняем структуру handles для использования в других подфункциях

guidata (gcbo, handles)

 

Аналогичные действия необходимо проделать в функции edit_b_Callback

 

function edit_b_Callback(hObject, eventdata, handles)

% hObject handle to edit_b (see GCBO)

% eventdata reserved-to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_b as text

% str2double(get(hObject,'String')) returns contents of edit_b as a double

b=str2double(get(hObject,'String'));

handles.b=b;

guidata (gcbo, handles)

 

Для обработки событий при нажатии на кнопку «Вычислить»:

 

function pbn_calculate_Callback(hObject, eventdata, handles)

% hObject handle to pbn_calculate (see GCBO)

% eventdata reserved-to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% вычисляем сумму а+b

c=handles.a+handles.b;

% запись суммы в поле a+b=

set (handles.edit_a_b, 'String', c)

% вычисляем произведение а*b

d=handles.a*handles.b;

% запись произведения в поле a*b=

set (handles.edit_ab, 'String', d)

 

Теперь интерфейс выглядит следующим образом (рис. 25).

 

Рис. 25. Интерфейс для вычисления суммы и произведения

 

Задание

Необходимо спроектировать интерфейс пользователя в среде GUIDE.

Определить функцию f(x) из таблицы 7, вычислить ее значение при х=3 и вывести на экран значение f(3). 

Построить график функции для х  [-5; 5] с шагом 1.

Во всех заданиях разместить оси Axes с размещением на них графического представления объекта с включением сетки.

Создать кнопку reset.

 

 

Таблица 7 – Варианты функций

 

Содержание отчета:

1. Титульный лист.

2. Цель работы.

3. Вариант задания.

4. Текст программы в MATLAB и полученный график.

5. Выводы по работе.

 

Контрольные вопросы

1. Какие элементы управления можно использовать при создании графического интерфейса MATLAB?

2. Какие компоненты содержит редактор GUIDE?

3. Как организуется указатель на какой-либо объект в m-файле MATLAB?

4. Назначение и синтаксис функций set и get.

5. Как организовать в интерфейсном окне объекты ввода и вывода численных данных?

 

 

.


Поделиться с друзьями:

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.159 с.