Глава 2. Графический интерфейс 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Глава 2. Графический интерфейс



Графические объекты. Графические приложения содержат меню, кнопки, области ввода текста, переключатели, графики.

Создание программ с визуальным интерфейсом. В окне CommandWindow следует набрать guide и тогда откроется окно для создания визуального интерфейса (Рис.2.1). В нем можно выбрать как уже существующие (OpenExistingGUI) так и создание нового интерфейса. Для этого предлагаются несколько наиболее распространенных типовых заготовок, а также возможность создать вообще сначала весь интерфейс (BlankGUIDefault).

Рис.2.1. В окне Command Window следует набрать guide и тогда откроется окно для создания визуального интерфейса

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

Для получения указателей есть функции: gcfвозвращает указатель в графическое окно, gca возвращает указатель на оси координат, gco возвращает указатель на графический объект.

Свойства графических объектов. Для установки свойств объектов есть функция set(указатель_на_объект, ‘изменяемое_свойство’, ‘его_новое_значение’,‘изменяемое_свойство_2’, ‘его_новое_значение_2’).

Для получения свойств объекта есть функция get(указатель_на_объект, ‘свойство’).

Для примера создадим вариант интерфейса (Рис.2.2).

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

Рис.2.2. Вариант интерфейса

Также предусмотрено построение графика какой-либо функции от какой-либо переменной по усмотрению пользователя, указывающего также минимальное и максимальное значения аргумента и шаг его изменения.

Для редактирования свойств элементов интерфейса, определенный элемент дважды щелкнуть мышкой (левой кнопкой). Откроется редактор свойств (PropertyInspector). В нем (Рис.2.3) например имя элемента (под которым он фигурирует в компьютере) называется Tag. Найдя слово Tag в левой колонке, в правой увидим само имя (напримерtext1). Надпись на элементе, которая видна в окне интерфейса, называется String. Найдя в левой колонке слово String, в правой ему соответствует сама надпись (например argumentx).

Файл интерфейса имеет расширение.fig.

Рис.2.3. Редактор свойств

Подготовка М-файла, соответствующего созданному интерфейсу. Для того, чтобы интерфейс (рис.2.4) был связан с выполнением требуемых действий (например, при нажатии на кнопку Calculate происходило бы вычисление функций и вывод их значений в соответствующих окошках) необходимо предварительно описать в М-файле все, что требуется сделать.

М-файл появится на экране после нажатия на соответствующую (четвертую справа) кнопку в ряду кнопок вверху экрана редактора интерфейса. В М-файле, имеющем то же самое название, как и файл интерфейса, уже автоматически сгенерирован текст в соответствии с выбранными пользователем элементами интерфейса. Каждому элементу интерфейса соответствует абзац текста, начинающийся с упоминания названия (Tag) элемента интерфейса.

Поскольку целесообразно начать с описания действий, выполняемых после нажатия на кнопку Calculate, то рассмотрим абзац текста в М-файле, описывающий их.

% --- Executes on button press in pushbutton1. CALCULATE

function pushbutton1_Callback(hObject, eventdata, handles)

 [VectorArg]=VvodArg(hObject, eventdata, handles);

[VectorRes]=ReshitZadachu(VectorArg);

VivodRes(VectorRes,hObject, eventdata, handles);

Дляэтоговфайлеинтерфейсащелкнемкнопку Calculate, открыв Property Inspector, инайдем Tag этойкнопки. Пусть, например, он оказался pushbutton1. Тогда в М-файле найдем абзац, озаглавленный

function pushbutton1_Callback(hObject, eventdata, handles)

В этом абзаце (то есть ниже строки его заголовка) укажем что должно произойти после ее нажатия.

function[VectorArg]=VvodArg(hObject, eventdata, handles)

x=str2double(get(handles.edit1,'String'));

y=str2double(get(handles.edit2,'String'));

z=str2double(get(handles.edit3,'String'));

VectorArg=[x, y, z];

Должна быть вызвана функция ввода аргументов, считывающая из соответствующих текстовых окошек исходные аргументы и возвращающая вектор (массив) аргументов.

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

function[VectorRes]=ReshitZadachu(VectorArg)

x=VectorArg(1);

y=VectorArg(2);

z=VectorArg(3);

f1=x^2+y+z;

f2=x+y^2+z;

f3=x+y+z^2;

VectorRes=[f1, f2, f3];

После этого должна быть вызвана функция для вывода в соответствующие окошки интерфейса значений из вектора результатов.

function[]=VivodRes(VectorRes,hObject, eventdata, handles)

f1=VectorRes(1);

f2=VectorRes(2);

f3=VectorRes(3);

S=sprintf('%g',f1);

set(handles.edit4,'String',S);

S=sprintf('%g',f2);

set(handles.edit5,'String',S);

S=sprintf('%g',f3);

set(handles.edit6,'String',S);

Упомянутые функции должны быть описаны. Рекомендуется описывать функции выше того места программы, где они вызываются.

Команда x=str2double(get(handles.edit1,'String')); означает что в переменную x будет записано число, возвращаемое функцией str 2 double которая преобразует строку цифр в число.

 Аргумент этой функции это возвращаемое значение функции get(handles.edit1,'String')); которая обращается к элементу интерфейса handles. edit 1 где handles означает обращение к визуальному интерфейсу, edit 1 это обозначение конкретного элемента интерфейса.

Команда S=sprintf('%g',f1); означает что в переменную S будет записана строка символов оператором sprintf('%g',f1); который обращается к аргументу f 1 и '% g ' указывает что аргумент является вещественным числом.

Команда set(handles.edit4,'String',S); означает что в элемент интерфейса edit 4 (окошко вывода текста) будет выведена строка символов содержащаяся в переменной S.

Построение графика. Для построения графика предназначена кнопка интерфейса Plot. Логикапостроенияграфикатакова

% --- Executes on button press in pushbutton2. PLOT

function pushbutton2_Callback(hObject, eventdata, handles)

 [VectorArg]=VvodArg(hObject, eventdata, handles);

PostrGraf(VectorArg,hObject, eventdata, handles);

Пользователь вводит в окошки ввода значения переменных NumFun (номер функции 1, 2 или 3), NumArg(номер аргумента), MinArg (минимальное значение аргумента, с него начинаются подписи к горизонтальной оси), MaxArg (максимальное значение аргумента, до него идут подписи к горизонтальной оси), StepArg (шаг изменения аргумента). Затем пользователь нажимает кнопку Plot и происходит построение графика в соответствии с введенными данными.

В М-файле опишем соответствующий этой кнопке абзац текста. После нажатия на кнопку вызывается функция VvodArg, считывающая исходные аргументы и возвращающая вектор их значений. Потом вызывается функция PostrGraf. Ей передается вектор аргументов. Она строит график. Для построения графика функция PostrGraf считывает из окошек текстового ввода интерфейса соответствующие переменные. Затем подсчитывает число шагов, вычитая минимальное значение из максимального и деля на величину шага.

function[]=PostrGraf(VectorArg,hObject, eventdata, handles)

NumFun=str2double(get(handles.edit7,'String'));

NumArg=str2double(get(handles.edit11,'String'));

MinArg=str2double(get(handles.edit12,'String'));

StepArg=str2double(get(handles.edit13,'String'));

MaxArg=str2double(get(handles.edit14,'String'));

NumberSteps=round((MaxArg-MinArg)/StepArg);

horis(1)=MinArg;

VectorArg(NumArg)=horis(1);

[VectorRes]=ReshitZadachu(VectorArg);

vert(1)=VectorRes(NumFun);

for i=2:NumberSteps+1

   horis(i)=horis(i-1)+StepArg;

   VectorArg(NumArg)=horis(i);

   [VectorRes]=ReshitZadachu(VectorArg);

   vert(i)=VectorRes(NumFun);

end

plot(horis,vert,'o-');

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

set(gca,'Ygrid','on');   

При этом команда round округляет до целого значения результат деления. NumberSteps=round((MaxArg-MinArg)/StepArg); после этого для каждого элемента массива горизонтальных координат horis точек графика и для каждого элемента массива вертикальных координат vert точек графика определяются значения. Когда все готово (рис.2.4), то команда plot строит график и затем на график накладывается координатная сетка.

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

Вычислить и сохранить результаты. Для того, чтобы вычислить результаты и сразу же сохранить их в файл, предназначена кнопка Calculate&Save.

В соответствующем этой кнопке тексте программы, происходит открытие файла

[f,p]=uiputfile('Путь к файлу\Имя файла.расширение', 'Окно выбора'); где среди возвращаемых значений p путь, f имя файла. После получения этих возвращаемых значений функции uiputfile, следует объединить эти данные с помощью команды KudaZapisat=strcat(p,f); дальнейшие действия так же, как в ранее рассмотренных упражнениях о работе с файлами.

% --- Executes on button press in pushbutton3. CALCULATE & SAVE

function pushbutton3_Callback(hObject, eventdata, handles)

%CALCULATE

[VectorArg]=VvodArg(hObject, eventdata, handles);

[VectorRes]=ReshitZadachu(VectorArg);

%OPEN FILE WT

[f,p]=uiputfile('C:\MATLAB701\work\exGuide_1Res.txt','Окновыбора');

KudaZapisat=strcat(p,f);

f=fopen(KudaZapisat,'wt');

%SAVE VALUES OF ARGUMENTS AND RESULTS

for i=1:3

   fprintf(f,'%g\t',VectorRes(i));

end

for i=1:3

   fprintf(f,'%g\t',VectorArg(i));

end

%sohranit v fail resultati vichislenij

fprintf(f,'\nexGuide_1Res\n');

fprintf(f,'RESULTATI VICHISLENIY\n');

TextString=strcat('Funct_#1\t','Funct_#2\t','Funct_#3\n');

fprintf(f,TextString);

fprintf(f,'%g\t\t\t',VectorRes(1));

fprintf(f,'%g\t\t\t',VectorRes(2));

fprintf(f,'%g\n',VectorRes(3));

%sohranit v fail ishodnije argumenti

fprintf(f,'ARGUMENTI VICHISLENIY\n');

TextString=strcat('argument#1_x\t','argument#2_y\t','argument#3_z\n');

fprintf(f,TextString);

for i=1:3

   fprintf(f,'%g\t\t\t\t',VectorArg(i));

end

fclose(f);

На рис.2.5 приведен пример окна интерфейса, которое при этом откроется.

Рис.2.5.Окно выбора пути и имени файла перед сохранением.

Построить и сохранить график. Для того, чтобы построить график и сразу же сохранить его, предназначена кнопка Plot&Save.

В соответствующем этой кнопке тексте программы сначала происходит построение графика. Можно было бы просто поставить вызов функции, уже описанной выше, которая строит график. Но все же более понятно для изучения, если все переменные вычисляются здесь же. Для контроля строится и сам график.

Затем, когда все переменные, описывающие график, определены, то открываем файл.

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

% --- Executes on button press in pushbutton4. PLOT & SAVE

function pushbutton4_Callback(hObject, eventdata, handles)

%PLOT   

[VectorArg]=VvodArg(hObject, eventdata, handles);  

NumFun=str2double(get(handles.edit7,'String'));

NumArg=str2double(get(handles.edit11,'String'));

MinArg=str2double(get(handles.edit12,'String'));

StepArg=str2double(get(handles.edit13,'String'));

MaxArg=str2double(get(handles.edit14,'String'));

NumberSteps=round((MaxArg-MinArg)/StepArg);

horis(1)=MinArg;

VectorArg(NumArg)=horis(1);

[VectorRes]=ReshitZadachu(VectorArg);

vert(1)=VectorRes(NumFun);

for i=2:NumberSteps+1

   horis(i)=horis(i-1)+StepArg;

   VectorArg(NumArg)=horis(i);

   [VectorRes]=ReshitZadachu(VectorArg);

   vert(i)=VectorRes(NumFun);

end

plot(horis,vert,'o-');

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

set(gca,'Ygrid','on');   

%OPEN FILE WT

[f,p]=uiputfile('C:\MATLAB701\work\exGuide_1Graf.txt','Окновыбора');

KudaZapisat=strcat(p,f);

f=fopen(KudaZapisat,'wt');

%gotovim dannije dlja avtomaticheskogo chitivanija

fprintf(f,'%d\t',NumberSteps);

for i=1:(NumberSteps+1)

   fprintf(f,'%g\t',horis(i));

end

fprintf(f,'\n');

for i=1:(NumberSteps+1)

   fprintf(f,'%g\t',vert(i));

end

%zapisivajem argumenti

for i=1:3

  fprintf(f,'%g\t',VectorArg(i));

end

fprintf(f,'%g\t',NumFun);

fprintf(f,'%g\t',NumArg);

fclose(f);

Открыть результаты вычислений из файла. Для открытия файла с результатами вычислений предназначена кнопка OpenData. В соответствующем ей месте программы опишем необходимые действия. Откроется окно, показанное на рис.2.6.

Рис.2.6.Окно выбора папки и файла перед открытием.

function[]=VivodArgumentovNaEkran(VectorArg,hObject, eventdata, handles);  

x=VectorArg(1);

y=VectorArg(2);

z=VectorArg(3);

S=sprintf('%g',x);

set(handles.edit1,'String',S);

S=sprintf('%g',y);

set(handles.edit2,'String',S);

S=sprintf('%g',z);

set(handles.edit3,'String',S);   

Функция uigetfile подготавливает данные об открываемом файле для чтения. При этом открывается окно выбора, где определяется имя файла и путь к нему. Эти данные являются возвращаемыми значениями для функции uigetfile. Получив их, объединяем их в одну переменную OtkudaChitat. Затем открываем файл. После открытия файла, считываем интересующие нас данные из файла в переменные с соответствующими названиями.

% --- Executes on button press in pushbutton5. OPEN DATA

function pushbutton5_Callback(hObject, eventdata, handles)

%OPEN FILE RT

[f,p]=uigetfile('C:\MATLAB701\work\exGuide_1Res*.txt','Окновыбора');

OtkudaChitat=strcat(p,f);

f=fopen(OtkudaChitat,'rt');

%chitat is faila

for i=1:3

   VectorRes(i)=fscanf(f,'%g',1);

end

for i=1:3

   VectorArg(i)=fscanf(f,'%g',1);

end

fclose(f);

%vivod na ekran

VivodRes(VectorRes,hObject, eventdata, handles);

VivodArgumentovNaEkran(VectorArg,hObject, eventdata, handles); 

Необходимо теперь вывести значения этих переменных в соответствующие окошки текстового вывода в интерфейсе. Для этого используем функцию VivodResи ранее не использовавшуюся функцию VivodArgumentovNaEkran, которую необходимо описать выше описания кнопки.

Открыть график и данные из файла. Открытие данных, необходимых для построения графика, из файла осуществляется кнопкой OpenData&Plot.

% --- Executes on button press in pushbutton6. OPEN DATA & PLOT

function pushbutton6_Callback(hObject, eventdata, handles)

%otkrit grafic is faila

[f,p]=uigetfile('C:\MATLAB701\work\exGuide_1Graf*.txt','Окновыбора');

OtkudaChitat=strcat(p,f);

f=fopen(OtkudaChitat,'rt');

%chitat is faila

NumberSteps=fscanf(f,'%d',1);

for i=1:NumberSteps+1

   horis(i)=fscanf(f,'%g',1);

end

for i=1:NumberSteps+1

   vert(i)=fscanf(f,'%g',1);

end

for i=1:3

  VectorArg(i)=fscanf(f,'%g',1);

end

NumFun=fscanf(f,'%g',1);

NumArg=fscanf(f,'%g',1);

fclose(f);

%stroim grafic

plot(horis,vert,'o-');

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

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

%vivod na ekran

VivodArgumentovNaEkran(VectorArg,hObject, eventdata, handles); 

S=sprintf('%g',NumFun);

set(handles.edit7,'String',S);

S=sprintf('%g',NumArg);

set(handles.edit11,'String',S);

В соответствующем ей тексте программы логика действий примерно такая же как и при открытии результатов вычислений из файла. После получения всех необходимых данных из файла, осуществляется построение графика. Кроме того, выводятся данные об исходных аргументах и, кроме того, о номере функции и номере аргумента, для которых построен график. При желании можно также доработать это упражнение и выполнить подписи к осям графика в соответствии с названиями аргументов и функций.


 



Поделиться:


Последнее изменение этой страницы: 2021-01-08; просмотров: 120; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.16.254 (0.099 с.)