figure
- Базовое приложениеПримечание
Эта тема относится к программным приложениям , создаваемым, использующим figure
функция. Альтернативные способы создать приложения см. в Способы создать приложения.
Этот пример показывает, как создать простое приложение программно, такое как показанное здесь.
Последующие разделы проведут вас через процесс создания этого приложения.
Если вы предпочитаете просматривать и запускать код, который создал это приложение, не создавая его, установите текущую папку на ту, к которой у вас есть доступ для записи. Скопируйте код примера и откройте его в редактор, выпустив следующий MATLAB® команды:
copyfile(fullfile(docroot, 'techdoc','creating_guis',... 'examples','simple_gui2*.*')), fileattrib('simple_gui2*.*', '+w'); edit simple_gui2.m
Создайте файл функции (в отличие от script file, который содержит последовательность команд MATLAB, но не определяет функции).
В подсказке MATLAB введите edit
.
Введите следующий оператора в первой линии редактора.
function simple_gui2
После оператора функции введите эти комментарии, заканчивающиеся пустой линией. (Комментарии отображаются в командной строке в ответ на help
команда.)
% SIMPLE_GUI2 Select a data set from the pop-up menu, then
% click one of the plot-type push buttons. Clicking the button
% plots the selected data in the axes.
(Leave a blank line here)
В конце файла после пустой линии добавьте end
оператор. Этот end
оператор требуется, поскольку в примере используются вложенные функции. Дополнительные сведения см. в разделе Вложенные функции.
Сохраните файл в текущей папке или в расположении, указанном в пути MATLAB.
Чтобы создать контейнер для пользовательского интерфейса (UI) приложения, добавьте следующий код перед end
оператор в вашем файле:
% Create and then hide the UI as it is being constructed. f = figure('Visible','off','Position',[360,500,450,285]);
Вызов на figure
функция создает традиционный рисунок и задает следующие свойства:
The Visible
для свойства задано значение 'off'
чтобы сделать окно невидимым при добавлении или инициализации компонентов. Окно становится видимым, когда пользовательский интерфейс имеет все свои компоненты и инициализируется.
The Position
свойство устанавливается в четырехэлементный вектор, который задает местоположение пользовательского интерфейса на экране и его размер: [расстояние слева, расстояние от дна, ширина, высота]. Модулями по умолчанию являются пиксели.
Создайте кнопки, статический текст, всплывающее меню и компоненты осей для пользовательского интерфейса.
Следуя вызову, чтобы figure
добавьте эти операторы в файл кода, чтобы создать три компонента кнопок.
% Construct the components. hsurf = uicontrol('Style','pushbutton',... 'String','Surf','Position',[315,220,70,25]); hmesh = uicontrol('Style','pushbutton',... 'String','Mesh','Position',[315,180,70,25]); hcontour = uicontrol('Style','pushbutton',... 'String','Contour','Position',[315,135,70,25]);
Каждый оператор использует ряд выражений uicontrol
property/value пар для определения кнопки:
The Style
свойство задает, что uicontrol
- кнопка нажатия.
The String
свойство задает метку на каждой кнопке: Surf
, Mesh
, и Contour
.
The Position
свойство задает местоположение и размер каждой кнопки: [расстояние слева, расстояние снизу, ширина, высота]. Модулями по умолчанию для кнопок являются пиксели.
Каждый uicontrol
вызов возвращает указатель созданной кнопки.
Добавьте всплывающее меню и текстовую метку путем добавления этих операторов в файл кода после определений кнопок. Первый оператор создает метку. Второй оператор создает всплывающее меню.
htext = uicontrol('Style','text','String','Select Data',... 'Position',[325,90,60,15]); hpopup = uicontrol('Style','popupmenu',... 'String',{'Peaks','Membrane','Sinc'},... 'Position',[300,50,100,25]);
Компонент всплывающего меню String
свойство использует массив ячеек, чтобы задать три элемента во всплывающем меню: Peaks
, Membrane
, и Sinc
.
Текстовый компонент, String
свойство задает инструкции для пользователя.
Для обоих компонентов Position
свойство задает размер и расположение каждого компонента: [расстояние слева, расстояние от дна, ширина, высота]. Модулями по умолчанию для этих компонентов являются пиксели.
Добавьте оси путем добавления этого оператора к файлу кода.
ha = axes('Units','pixels','Position',[50,60,200,185]);
The Units
свойство задает пиксели так, чтобы оси имели те же модули, что и другие компоненты.
Следуя всем определениям компонентов, добавьте эту линию в файл кода, чтобы выровнять все компоненты, кроме осей, по их центрам.
align([hsurf,hmesh,hcontour,htext,hpopup],'Center','None');
Добавьте эту команду после align
команда.
f.Visible = 'on';
Ваш файл кода должен выглядеть следующим образом:
function simple_gui2 % SIMPLE_GUI2 Select a data set from the pop-up menu, then % click one of the plot-type push buttons. Clicking the button % plots the selected data in the axes. % Create and then hide the UI as it is being constructed. f = figure('Visible','off','Position',[360,500,450,285]); % Construct the components. hsurf = uicontrol('Style','pushbutton','String','Surf',... 'Position',[315,220,70,25]); hmesh = uicontrol('Style','pushbutton','String','Mesh',... 'Position',[315,180,70,25]); hcontour = uicontrol('Style','pushbutton',... 'String','Contour',... 'Position',[315,135,70,25]); htext = uicontrol('Style','text','String','Select Data',... 'Position',[325,90,60,15]); hpopup = uicontrol('Style','popupmenu',... 'String',{'Peaks','Membrane','Sinc'},... 'Position',[300,50,100,25]); ha = axes('Units','Pixels','Position',[50,60,200,185]); align([hsurf,hmesh,hcontour,htext,hpopup],'Center','None'); % Make the UI visible. f.Visible = 'on'; end
Запустите свой код, набрав simple_gui2
в командной строке. Можно выбрать набор данных во всплывающем меню и нажать кнопки, но ничего не происходит. Это происходит потому, что в файле нет кода коллбэка для обслуживания всплывающего меню или кнопок.
Всплывающее меню позволяет пользователям выбирать данные для построения графика. Когда пользователь выбирает один из трех наборов данных во всплывающем меню, программное обеспечение MATLAB настраивает всплывающее меню Value
свойство к индексу выбранного элемента меню. Обратный коллбэк всплывающего меню считывает всплывающее меню Value
свойство, чтобы определить, какой элемент в данный момент отображается и устанавливает current_data
соответственно.
Добавьте следующий коллбэк к своему файлу после кода инициализации и перед конечным end
оператор.
% Pop-up menu callback. Read the pop-up menu Value property to % determine which item is currently displayed and make it the % current data. This callback automatically has access to % current_data because this function is nested at a lower level. function popup_menu_Callback(source,eventdata) % Determine the selected data set. str = source.String; val = source.Value; % Set current data to the selected data set. switch str{val}; case 'Peaks' % User selects Peaks. current_data = peaks_data; case 'Membrane' % User selects Membrane. current_data = membrane_data; case 'Sinc' % User selects Sinc. current_data = sinc_data; end end
Каждая из трех кнопок создает другой тип графика, используя данные, заданные текущим выбором во всплывающем меню. Кнопка коллбэков постройте график данных в current_data
. Они автоматически имеют доступ к current_data
потому что они вложены на более низком уровне.
Добавьте следующие коллбэки к файлу после коллбэка всплывающего меню и перед окончательным end
оператор.
% Push button callbacks. Each callback plots current_data in the % specified plot type. function surfbutton_Callback(source,eventdata) % Display surf plot of the currently selected data. surf(current_data); end function meshbutton_Callback(source,eventdata) % Display mesh plot of the currently selected data. mesh(current_data); end function contourbutton_Callback(source,eventdata) % Display contour plot of the currently selected data. contour(current_data); end
Когда пользователь выбирает набор данных из всплывающего меню или нажимает одну из кнопок, MATLAB выполняет коллбэк, связанную с этим конкретным событием. Используйте Callback
каждого компонента свойство, задающее имя коллбэка, с которым связано каждое событие.
На uicontrol
оператор, который задает Surf кнопку, добавить пару свойство/значение
'Callback',{@surfbutton_Callback}
чтобы оператор выглядел так:
hsurf = uicontrol('Style','pushbutton','String','Surf',... 'Position',[315,220,70,25],... 'Callback',{@surfbutton_Callback});
Callback
- имя свойства. surfbutton_Callback
- имя коллбэка, который обслуживает Surf кнопку.
На uicontrol
оператор, который задает Mesh кнопку, добавить пару свойство/значение
'Callback',@meshbutton_Callback
На uicontrol
оператор, который задает Contour кнопку, добавить пару свойство/значение
'Callback',@contourbutton_Callback
На uicontrol
оператор, который задает всплывающее меню, добавьте пару свойство/значение
'Callback',@popup_menu_Callback
Для получения дополнительной информации смотрите Запись коллбэков для приложений, созданных программно.
Инициализируйте пользовательский интерфейс, чтобы он был готов, когда окно станет видимым. Заставьте пользовательский интерфейс вести себя правильно, когда он изменяет размер путем изменения модулей компонента и рисунка на normalized
. Это заставляет компоненты изменять размер при изменении размера пользовательского интерфейса. Нормированные модули левого нижнего угла окна рисунка (0,0)
и правый верхний угол для (1.0, 1.0)
.
Замените этот код в редакторе:
% Make the UI visible. f.Visible = 'on';
с помощью этого кода:
% Initialize the UI. % Change units to normalized so components resize automatically. f.Units = 'normalized'; ha.Units = 'normalized'; hsurf.Units = 'normalized'; hmesh.Units = 'normalized'; hcontour.Units = 'normalized'; htext.Units = 'normalized'; hpopup.Units = 'normalized'; % Generate the data to plot. peaks_data = peaks(35); membrane_data = membrane; [x,y] = meshgrid(-8:.5:8); r = sqrt(x.^2+y.^2) + eps; sinc_data = sin(r)./r; % Create a plot in the axes. current_data = peaks_data; surf(current_data); % Assign a name to appear in the window title. f.Name = 'Simple GUI'; % Move the window to the center of the screen. movegui(f,'center') % Make the UI visible. f.Visible = 'on';
Убедитесь, что ваш код отображается должным образом, и запустите его.
Проверьте, что ваш файл кода выглядит следующим образом:
function simple_gui2 % SIMPLE_GUI2 Select a data set from the pop-up menu, then % click one of the plot-type push buttons. Clicking the button % plots the selected data in the axes. % Create and then hide the UI as it is being constructed. f = figure('Visible','off','Position',[360,500,450,285]); % Construct the components. hsurf = uicontrol('Style','pushbutton',... 'String','Surf','Position',[315,220,70,25],... 'Callback',@surfbutton_Callback); hmesh = uicontrol('Style','pushbutton',... 'String','Mesh','Position',[315,180,70,25],... 'Callback',@meshbutton_Callback); hcontour = uicontrol('Style','pushbutton',... 'String','Contour','Position',[315,135,70,25],... 'Callback',@contourbutton_Callback); htext = uicontrol('Style','text','String','Select Data',... 'Position',[325,90,60,15]); hpopup = uicontrol('Style','popupmenu',... 'String',{'Peaks','Membrane','Sinc'},... 'Position',[300,50,100,25],... 'Callback',@popup_menu_Callback); ha = axes('Units','pixels','Position',[50,60,200,185]); align([hsurf,hmesh,hcontour,htext,hpopup],'Center','None'); % Initialize the UI. % Change units to normalized so components resize automatically. f.Units = 'normalized'; ha.Units = 'normalized'; hsurf.Units = 'normalized'; hmesh.Units = 'normalized'; hcontour.Units = 'normalized'; htext.Units = 'normalized'; hpopup.Units = 'normalized'; % Generate the data to plot. peaks_data = peaks(35); membrane_data = membrane; [x,y] = meshgrid(-8:.5:8); r = sqrt(x.^2+y.^2) + eps; sinc_data = sin(r)./r; % Create a plot in the axes. current_data = peaks_data; surf(current_data); % Assign the a name to appear in the window title. f.Name = 'Simple GUI'; % Move the window to the center of the screen. movegui(f,'center') % Make the window visible. f.Visible = 'on'; % Pop-up menu callback. Read the pop-up menu Value property to % determine which item is currently displayed and make it the % current data. This callback automatically has access to % current_data because this function is nested at a lower level. function popup_menu_Callback(source,eventdata) % Determine the selected data set. str = get(source, 'String'); val = get(source,'Value'); % Set current data to the selected data set. switch str{val}; case 'Peaks' % User selects Peaks. current_data = peaks_data; case 'Membrane' % User selects Membrane. current_data = membrane_data; case 'Sinc' % User selects Sinc. current_data = sinc_data; end end % Push button callbacks. Each callback plots current_data in the % specified plot type. function surfbutton_Callback(source,eventdata) % Display surf plot of the currently selected data. surf(current_data); end function meshbutton_Callback(source,eventdata) % Display mesh plot of the currently selected data. mesh(current_data); end function contourbutton_Callback(source,eventdata) % Display contour plot of the currently selected data. contour(current_data); end end
Запустите приложение, набрав simple_gui2
в командной строке. Код инициализации заставляет его отображать значение по умолчанию peaks
данных с surf
функция, делая пользовательский интерфейс таким.
Во всплывающем меню выберите Membrane и нажмите кнопку Mesh. Пользовательский интерфейс отображает сетчатый график MathWorks® L-образный логотип мембраны.
Попробуйте другие комбинации перед закрытием пользовательского интерфейса.
Тип help simple_gui2
в командной строке. MATLAB отображает текст справки.
help simple_gui2 SIMPLE_GUI2 Select a data set from the pop-up menu, then click one of the plot-type push buttons. Clicking the button plots the selected data in the axes.